2010-04-26 47 views

回答

9

文檔:http://docs.djangoproject.com/en/dev/topics/http/file-uploads/

短版:

  1. 你上傳表單需要有一個forms.FileField場。
  2. 當表單提交後,它會轉到一個URL,該URL轉到您寫入的查看函數。該視圖函數需要HttpRequest(通常名爲request)。
  3. request.FILES[]獲取文件。

例如,如果您的形式有:

upFile = forms.FileField 

那麼你的觀點可以得到該文件與:

def uploadView(request): 
    upFile = request.FILES["upFile"] 

其中upFile是一個UploadedFile對象,這是一個類似文件的對象。一個UploadedFile具有以下屬性:

  • name:名稱上傳文件
  • size的:字節大小

和下面的方法:

  • read():閱讀整個文件並以字符串形式返回。可能對你有好處,但不建議超過2.5 MB的文件。如果該文件應該作爲多個塊處理,則返回True
  • chunks():返回一個生成器(使用它像一個迭代器),它一次返回一個塊的文件數據。

因此,持續的例子,如果你只是想將文件保存到磁盤,你可以寫:

outFile = open("/tmp/uploadTest.txt", "w") 
if not upFile.multiple_chunks(): 
    outFile.write(upFile.read()) 
else: 
    for chunk in upFile.chunks(): 
     outFile.write(chunk) 
outFile.close() 

在你的情況,你很可能只是顯示錯誤信息,並丟棄文件如果multiple_chunks()返回True,因爲您可能不打算在您的頁面上放置超過2.5 MB的文本。

編輯:嗯,你的問題完全改變,而我正在寫我的答案。所以,闡明如何把文件內容的頁面,並假設該文件不超過2.5 MB,您的視圖功能可能看起來像:

def uploadView(request): 
    upFile = request.FILES["upFile"] 
    context = {} 
    if upFile.multiple_chunks(): 
     context["uploadError"] = "Uploaded file is too big (%.2f MB)." % (upFile.size,) 
    else: 
     context["uploadedFile"] = upFile.read() 
    return render_to_response('fileUploadPage.html', context) 

增加,當然,任何其他視圖處理需要。

然後你fileUploadPage.html模板需要有地方:

<div id="uploaded"> 
    {% if uploadError %} 
    <span class="error">{{ uploadError }}</span> 
    {% else %} 
    {{ uploadedFile }} 
    {% endif %} 
</div> 

編輯2:多米尼克好點。以下是用於正確設置form標籤的通用模板代碼。使用這個方法有一個形式的模板:

<form method="post" action="{% url uploadFile %}" 
{% if form.is_multipart %} 
    enctype="multipart/form-data" 
{% endif %}> 
{{ form }} 
</form> 

在你的情況,因爲你知道的形式將在這一個文件,你可以失去的if塊:

<form method="post" action="{% url uploadFile %}" enctype="multipart/form-data"> 
{{ form }} 
</form> 

注意: {% url ___ %}命令將放入視圖或命名URL的URL中。該參數是視功能的任何名稱爲您urls.py文件中使用,或給予url對象的名稱,例如:在約`enctype`的``

標籤

urlpatterns = patterns('', 
    url('^uploadform$', 'myapp.views.uploadFormView', name='uploadForm'), 
    url('^upload$', 'myapp.views.uploadView', name='uploadFile'), 
    # ... 
) 
+1

你能添加的東西?保存OP運行時遇到麻煩! – 2010-04-26 13:45:35

+0

@Mike D.--我重寫了這個問題 - 我不認爲*我改變了意思,只是希望更容易解析。 – 2010-04-26 13:54:21

+0

這看起來不像一個非常「短」的版本... – 2010-04-27 01:25:38

相關問題