jQueryで.postしようと思ったらfileはpostできない件

今更ながらjQueryにハマってまして、今日も画面遷移なしで画像がアップロードできるスクリプトを書こうとしたのですが、Javascriptではfileをpostできないことに気付いた><

で、画面遷移なしでファイルをアップロードしようと思ったらiframeを使ったりするらしい。Ajaxではないけど、Ajaxっぽい動きですな。

ということでサクっと書いてみた

アップロード用ページ upload.html

<html>
<head>
<style>
#dummy{
/* display:none; するとSafariだとおかしくなるらしい? */
border:0px;
width:0px;
height:0px;
}
#image{
display:none;
max-width:480px;
}
</style>
</head>
<body>
<iframe name="dummy" id="dummy"></iframe>
<div id="message"></div>
<img id="image"></div>
<form action="upload.php" method="post" target="dummy" enctype="multipart/form-data">
<input type="file" name="img" />
<input type="submit" value="Upload">
</form>
</body>
</html>

注意点はiframeにdisplay:none;するとSafariだとおかしくなるらしいんだけど、ウチの環境では別にどっちでも行けた(Mac OSX 10.6.6, Safari 5.0.3)
http://groundwalker.com/blog/2007/02/file_uploader_and_safari.html

ファイルアップロード処理とか upload.php

<?php
$error = 0;
$msg = "";
$filename = "";
if ($_FILES["img"]["error"] == 0) {
$info = getimagesize($_FILES['img']['tmp_name']);
if ($info[2] != 2 && $info[2] != 3 && $info[2] != 6) {
$msg = "画像ファイルでお願いします。";
$error++;
} else {
$exts = array(2 => '.jpg', 3 => '.png', 6 => '.bmp');
$ext = $exts[$info[2]];
$filename = "tmp/hoge".$ext;
move_uploaded_file($_FILES["img"]["tmp_name"], $filename);
chmod($filename, 0666);
$msg = "ファイルをアップロードしました。";
}
} else {
$msg = "ファイルのアップロードに失敗しました。";
$error++;
}
// jsonで出してeval
$results = sprintf('{"error":"%s","msg":"%s","filename":"%s"}', $error, $msg, $filename);
?>
<html>
<head>
<script src="jquery.js"></script>
<script type="text/javascript">
//<![CDATA[
$('document').ready(function(){
var results = eval('(<?php echo $results;?>)');
// 親ウィンドウのオブジェクトはwindow.parent.documentってやったらとれる
$('#message', window.parent.document).html(results["msg"]);
if (results["error"] == 0) {
$('#image', window.parent.document).css('display', 'block').attr('src', results["filename"]);
}
});
//]]>
</script>
</head>
<body>
</body>
</html>

別にこの程度ならjQuery使う必要は全然ないんですけどねw
フツウに書いてもコード量は変わらんですw

ポイントはjQueryでiframeから親windowのDOM要素を操作する場合は
$(‘対象のidとか’, window.parent.document)
ってやるとできる。

素のjavascriptで書いた
parent.document.getElementById(“対象のid”)
とほぼ一緒かな。

Filed under: Javascript,PHP,Programming — maesan 9:15 PM

[PHP] move_uploaded_file→ご一緒にchmodはいかがっすか?

いや、たまにやるんだけど自分メモ

PHPでファイルアップロードする場合に

$filename = "hoge.jpg";
move_uploaded_file($_FILES["hoge"]["tmp_name"], $filename);

とかするっしょ?
んで普通に使う分には問題ないんだけど、デフォルトのパーミッションが600で保存されちゃうので、ちょっとftpとかSCPでアクセスした時に何にもできないってなるんだよね><
root権限とかあったらイイけど、フツウにレンタルサーバーとかでやっちゃったらもう大変w
わざわざファイルの削除するスクリプト書いてapacheに実行してもらわないといけないw
なので、move_uploaded_fileしたあとはchmodで666とかにしといたほうがよいです。

$filename = "hoge.jpg";
move_uploaded_file($_FILES["hoge"]["tmp_name"], $filename);
chmod($filename, 0666);

※ 666じゃなくて0666って書かないとダメかもよ

Filed under: PHP,Programming — maesan 5:03 PM

[MySQL + Linux] sonameでハマる

Python+MySQLdbでちょっとしたスクリプト書いてたんだけど、ローカルのMacではまともに動くのに、LinuxサーバーではSQLのsyntaxエラーが出ちゃいました。
はじめは全くわけが分からず、なんで怒られてるのかわからなかったのですが、どうやら原因はsonameってフィールド名を使ってたかららしい。

正直sonameって何やねん?って感じだったのですが、

Linuxのshared object呼び出したりする時の名前らしいね!
MySQL+Linuxではユーザー定義関数とか作る時にsonameって使うらしいね!
てかSQL書く時にフィールド名は`で囲めよオレ!

Filed under: Linux,MySQL,Programming — maesan 7:21 PM

[Django] 同じモデルに対して複数の外部キーを設定したい

Django で同じモデルに対して複数の外部キーを設定したかったのですが、ちょとハマったのでメモ

例えば、試合モデルとチームモデルがあって、試合モデルにホームチームとアウェイチームを関連付けたい

DB的に言うとこんな感じ

CREATE TABLE `team` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`name` varchar(80) NOT NULL
);
CREATE TABLE `game` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`game_date` datetime NOT NULL,
`home_team_id` integer NOT NULL,
`away_team_id` integer NOT NULL
);

んでモデルの定義はこんな感じにしてみた

class Team(models.Model):
name = models.CharField(max_length=80)

class Game(models.Model):
game_date = models.DateTimeField()
home_team = models.ForeignKey(Team)
away_team = models.ForeignKey(Team)

んでsyncdbしてみたらこんなエラー出た

Error: One or more models did not validate:
hoge.game: Accessor for field ‘home_team’ clashes with related field ‘Team.game_set’. Add a related_name argument to the definition for ‘home_team’.
hoge.game: Accessor for field ‘away_team’ clashes with related field ‘Team.game_set’. Add a related_name argument to the definition for ‘away_team’.

しばらく悩み調べた結果related_nameを定義すればおkだった。

class Team(models.Model):
name = models.CharField(max_length=80)

class Game(models.Model):
game_date = models.DateTimeField()
home_team = models.ForeignKey(Team, related_name="home_team")
away_team = models.ForeignKey(Team, related_name="away_team")

参考ページ

Multiple Foreign Keys to same Table?

Filed under: Django,Programming,Python — maesan 1:11 AM

[Django] CSRF verification failed.

取りあえずDjangoはじめて、とりあえずformつくって、とりあえずPOSTしてみて「CSRF verification failed.」って出たらsettings.pyのMIDDLEWARE_CLASSESにdjango.middleware.csrf.CsrfResponseMiddlewareを入れとくとおk


MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.csrf.CsrfResponseMiddleware', # <-コレ
)
Filed under: Django,Programming,Python — maesan 7:30 PM

[svn] ログを詳細に表示するには –verbose をつける

いつも忘れるので覚え書き

$svn log –verbose hoge.txt

Filed under: Programming — maesan 9:45 PM
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)