django上传文件,查询到的资料都是用的django自己的models.Model类,去定义一个FileField类型的存储文件,并且在里面加一句upload_to,如下所示:
但是如果用mongodb,虽然Document有FileField类型,但是没有upload_to这个参数,所以写了一个方法去将POST里面的文件存储到本地
存储文件的方法如下:
def uploaded_file(f,filename):
address ='C:/Users/XXXX/Desktop/'+filename
destination = open(address, 'wb+')
for chunk in f.chunks():
destination.write(chunk)
destination.close()
注方法说明:参数f为POST的FILES文件,filename为要存储的文件名,之所以没有用一个固定的地址,是因为上传的文件类型是不定的,可能还txt,也可能是jpg等
html模板里的上传代码:
<form id="formid" method="POST" action="" enctype="multipart/form-data">
<div class="file-box">
<input type='text' name='protextfield' id='protextfield' class='txt' />
<input type='button' class='btn' value='浏览...' />
<input type="file" name="proupload" class="file" id="fileField" size="28" onchange="document.getElementById('protextfield').value=this.value" />
<input type="submit" name="submit" class="btn" value="上传" />
</div>
</form>
模板注意点:form必须加enctype="multipart/form-data",否则不能传送文件。
在view.py里调用该方法执行的上传操作
def newproject(request):
if request.FILES:
filename =request.FILES['proupload'].name
uploaded_file(request.FILES['proupload'],filename)
post.proadress = filename
return render_to_response('XXX.html', locals())
说明:上面的方法中的filename是获得了上传的文件名,包括文件后缀,例如test.txt。request.FILES['proupload']是获得了名字为proupload的文件。这么做的结果就是将上传的文件存储到了一个本地固定的位置,并存储了文件名到数据库里。
其他说明:目前没有做下载,但是下一步思路是想将所有文件固定存储到一个文件夹里,或者按后缀去分开存储,然后下载的时候按照文件名在存储文件夹里遍历,取出要找的文件进行下载。