2013-07-31 23 views
0

根據有關上傳的官方django文檔,小文件被保存到內存,大文件被保存到磁盤。在Google App引擎中使用django nonrel上傳和保存文件?

我想知道如何將上傳的文件保存到磁盤?可能嗎?

這是我的代碼到目前爲止。但它只適用於內存。當我嘗試將文件寫入磁盤時,或者文件體積很大時,應用程序崩潰。

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' 

謝謝

回答

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撥弄,默認的罰款。

+0

感謝您的信息。我發現這個有用的文檔還有: http://www.allbuttonspressed.com/projects/django-filetransfers#installation 它看起來像數據存儲不是保存文件的最佳選擇。可能它必須通過blobstore或其他外部位置來完成。例如:AWS S3 – ipegasus

相關問題