【问题标题】:Uploading and saving files using django nonrel in Google App engine?在 Google App 引擎中使用 django nonrel 上传和保存文件?
【发布时间】:2013-08-01 16:48:29
【问题描述】:

根据django官方关于上传的文档,小文件保存到内存,大文件保存到磁盘。

我想知道如何将上传的文件保存到磁盘?有可能吗?

到目前为止,这是我的代码。但它只适用于内存。当我尝试将文件写入磁盘时,或者文件很大时,应用程序会崩溃。

views.py

# ...
def spreadsheet_form(request, id = None):
    if is_admin_user(request):
        instance = get_object_or_404(Spreadsheet, id=id) if id is not None else None
        form = SpreadsheetForm(request.POST or None, request.FILES or None, instance=instance)
        if form.is_valid():
            spreadsheet = form.save(commit=False)
            spreadsheet.name = request.POST['name']
            spreadsheet.spreadsheet_file = request.FILES['spreadsheet_file'].name
            spreadsheet.size = request.FILES['spreadsheet_file'].size
            spreadsheet.save()
            handle_uploaded_file(request.FILES['spreadsheet_file'])
            return redirect('/spreadsheets/')
        return render_to_response("pages/spreadsheet_form.html", {"form": form,"id":id},context_instance=RequestContext(request))
    else:
        return redirect('/', False)
# ...
def handle_uploaded_file(f):
    with open(f.name, 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

models.py

# ...
class Spreadsheet(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256)
    spreadsheet_file = models.FileField(upload_to='spreadsheets/')
    size = models.CharField(max_length=32)
    created_at = models.DateTimeField(auto_now=True)
    # ...
    def __unicode__(self):
        return u'%s' % (self.name )

settings.py

FILE_UPLOAD_HANDLERS = (
    "django.core.files.uploadhandler.MemoryFileUploadHandler",
    "django.core.files.uploadhandler.TemporaryFileUploadHandler",
)
FILE_UPLOAD_MAX_MEMORY_SIZE = 7000000
FILE_UPLOAD_TEMP_DIR = '/tmp'

提前致谢

【问题讨论】:

    标签: django google-app-engine file-upload django-nonrel


    【解决方案1】:

    在 App Engine 世界中没有“保存到磁盘”之类的东西。最接近的是 Blobstore,现在是 GCS。

    django-nonrel 包含一个用于上传到 Blobstore 的 django 存储类。按照这个:

    http://www.allbuttonspressed.com/blog/django/2010/06/Uploads-to-Blobstore-and-GridFS-with-Django

    您不需要摆弄 FILE_UPLOAD_HANDLERS,默认值就可以了。

    【讨论】:

    • 感谢您的信息。我还发现了这个有用的文档:allbuttonspressed.com/projects/… 看起来数据存储不是保存文件的最佳选择。可能必须通过 blobstore 或其他一些外部位置来完成。例如:AWS S3
    猜你喜欢
    • 2012-06-01
    • 2012-01-03
    • 2011-04-29
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多