現在の設定:
- nginxはポート80でリッスンし、example.comリクエストを8080のApacheに転送します
- ポート8080でリッスンしているApache、wsgi経由でDjangoアプリに接続
- Djangoフォームは画像をサブドメインphotos.example.com/upload/にアップロードします
これはnginxの構成ファイルからのもののようですが、指を置くことができません。私は主にnginxでupload_storeディレクティブを変更しようとしました。ユーザーがアップロードした写真を/var/ www / dev / source / nginx /media/に保存したい
私が今できる最善のことは、/ var/wwwからそれらを入れたいフォルダへのシンボリックリンクです。
関連するnginx構成:
server {
client_max_body_size 100m;
listen 80;
server_name photos.example.com;
access_log /var/log/nginx/photos.example.com/access.log;
error_log /var/log/nginx/photos.example.com/error.log;
# Upload form should be submitted to this location
location /upload {
# Pass altered request body to this location
# Store files to this location
upload_store /var/www/dev/source/nginx/media 1;
# Set specified fields in request body
upload_set_form_field $upload_field_name.name "$upload_file_name";
upload_set_form_field $upload_field_name.content_type "$upload_content_type";
upload_set_form_field $upload_field_name.path "$upload_tmp_path";
}
# Pass altered request body to a proxy
location / {
root /var/www/dev/source/nginx/media;
}
}
関連models.py
:
def rename_image(instance,filename):
random = ''.join([choice(letters) for i in xrange(10)])
today = datetime.date.today()
userid = instance.user.username
filename = '_'.join([today.strftime('%s'),userid,random,filename])
return'/'.join(['images','users',userid,filename])
class Users(models.Model):
user = models.OneToOneField(User)
...
photo = models.ImageField(upload_to=rename_image)
編集:
別のパス(テストとしてimgzというディレクトリを作成)に設定しようとすると、これはnginxエラーログにあります:(その後、imgzも作成して修正されるかどうかを確認しましたが、修正されませんでした)
2012/12/02 09:37:44[エラー]31229#0:* 56472 open() "/var/www/dev/source/nginx/media/imgz/users/1354424400_lmDdkskvEPbrtUYBudgzsLjiOXvywx_gwslfBWlBk_me.jpg"が失敗しました(2:そのようなものはありませんファイルまたはディレクトリ)、クライアント:xx.xx.example.example、サーバー:photos.example.com、リクエスト: "GET /imgz/users/1354424400_lmDdkskvEPbrtUYBudgzsLjiOXvywx_gwslfBWlBk_me.jpg HTTP / 1.1"、ホスト: "photos.example.com"、リファラー: " http://dev.example.com/lmDdkskvEPbrtUYBudgzsLjiOXvywx "
EDIT2:
実際、これはPOSTの後に発生するGETリクエストです。アップロードされたばかりの画像を表示しようとしているのはDjangoアプリです。私が正しく覚えていれば、フォームのPOSTはほとんどの場合成功します。パスを変更すると、/ var/wwwに別のパスが作成されます。