4

次のコードを使用して画像を正常にアップロードしました。

ビュー.py

from django.conf.urls.defaults import *
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from django import template
from django.template import RequestContext

from mysite.uploadr.forms import UploadFileForm

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            form.handle_uploaded_file(request.FILES['file'])
            return HttpResponse(template.Template('''
                        <html><head><title>Uploaded</title></head> <body>
                        <h1>Uploaded</h1>
                        </body></html>
                        '''
                        ).render( template.Context({}))
                    )
    else:  
        form = UploadFileForm()
    return render_to_response('upload.html', {'form': form}, context_instance=RequestContext(request))

フォーム.py

from django import forms
from settings import MEDIA_ROOT

class UploadFileForm(forms.Form):
    title = forms.CharField(max_length = 50)
    file = forms.FileField()

    def handle_uploaded_file(self,file):
        #print type(file), "file.name=",file.name
        #print dir(file)
        destination = open(MEDIA_ROOT + '/images/'+file.name, 'wb+')
        for chunk in file.chunks():
            destination.write(chunk)

さらに一歩進んで、アップロードしているユーザーに画像を関連付けたいと思います。私はいくつかの例を見て、https://stackoverflow.com/questions/3348013/django-image-file-uploads の記事のテクニックを気に入っています。

彼らのコードは save() とcleaned_data を使用していることに気付きました。ドキュメントの例のように、チャンクを反復処理して宛先フォルダーに書き込む必要はありませんか? clean_data を使用する必要がありますか? ファイルをアップロードする最も効率的な方法を見つけようとしているだけで、これを行うさまざまな方法を見てきました。どうぞよろしくお願いいたします。

4

2 に答える 2

4

ファイルがより大きい場合は、チャンクが必要ですsettings.FILE_UPLOAD_MAX_MEMORY_SIZE(django 1.2 のデフォルトは 2.5M)。

django.core.files.storage.FileSystemStorageクラスを見てください。save() メソッドは、チャンクごとの保存ジョブを実行し、適切なファイル ロックを行います。

storage = FileSystemStorage(
                    location = '/var/www/site/upfiles', 
                    base_url = '/upfiles'
                  )


content = request.FILES['the_file']
name = storage.save(None, content) #you can use some suggested name instead of
                                   #None. content.name will be used with None
url = storage.url(name)   #<-- get url for the saved file

django の古いバージョン (1.0 など) では、ファイル名の生成に欠陥がありました。同じファイルを繰り返しアップロードすると、ファイル名に追加_され続け、アップロードされたファイル名がどんどん長くなります。これはバージョン 1.2 で修正されたようです。

于 2010-08-15T18:01:50.443 に答える
1

直接アクセスするrequest.FILES['file']ことで、UploadFileFormが実行している処理をバイパスします(そのようなファイルを処理するためのフォームクラスも必要ありません)。form.cleaned_data['file']処理された(そして、cleanメソッドを追加した場合はcleaned)フォームデータにアクセスします。request.POSTフォームデータの代わりに、辞書に直接アクセスすることもできます。正当な理由がない限り、クリーンアップされたフォームデータを使用することをお勧めします。

あなたが与えた例では、使用されているモデル(save()メソッドが呼び出されていたもの)もあり、ファイルアクセスを処理していたのはモデルのフィールドでした。アップロードしたファイルに関する情報をデータベースに保存したい場合は、それが最適な方法です。

組み込みのファイルストレージAPIを使用して、ファイルを保存できます:http: //docs.djangoproject.com/en/dev/ref/files/storage/#ref-files-storage

open(MEDIA_ROOT + '/images/'+file.name, 'wb+')また、ユーザー指定のファイル名で単に呼び出すことはお勧めできません。これは、ディレクトリトラバーサルやその他の問題を求めているだけです。

于 2010-08-17T20:12:16.160 に答える