在我进入任何 javascript 之前,首先您应该了解文件通常是如何使用 Django 上传和处理的。考虑以下 html 表单:
<form method="post" action="/foo/url/">
<input type="file" name="foofile">
<input type="submit" value="Upload">
</form>
因此,当用户单击提交按钮时,浏览器会使用 HTTP 方法 POST 将该文件上传到 /foo/url/。然后在 Django 的服务器端,url /foo/url/ 将被映射到某个视图。在您的情况下,它将是storeAndProcessFile。所以视图要做的就是获取上传的文件并将其存储到磁盘(或者可能是其他一些存储系统)。
现在视图不会像您在问题中显示的那样将文件作为其函数参数之一。这是因为 GET、POST 和 FILE 数据是如何在 HTTP 请求中传递的。所以该文件实际上是视图内request 参数的一部分。您可以通过request.FILES['foofile'] 引用该文件。
要将文件存储到磁盘,您的视图可能类似于:
def storeAndProcessFile(request):
# make sure the the request method is POST
if request.method != 'POST':
return HttpResponseBadRequest('Only POST requests are allowed')
# now get the uploaded file
file = request.FILES['foofile']
# the file is going to be an instance of UploadedFile
with open('/destination/path/%s' % file.name, 'wb+') as dest:
for chunk in file.chunks():
dest.write(chunk)
# return success message
return HttpResponse('File uploaded')
这段代码几乎来自 Django 文档。想了解更多,可以阅读here。
至于 Javascript,有大量的 jQuery 插件可以使用 ajax 上传文件,甚至可以一次上传多个文件。我真的很喜欢this 图书馆。它具有许多功能,包括发送多个文件。但是,如果这太多了,您可以搜索 jQuery 文件上传插件,其中有很多,但我最近没有测试任何其他插件,因此无法给出任何建议。
然而,在向 Django 站点发出 ajax 请求时需要记住一件事,即 CSRF。从 Django 1.2.5 开始,他们改变了 CSRF 的验证方式,这可能会破坏许多上传库。如果不用担心,可以随时添加csrf_exempt装饰器:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def storeAndProcessFile(request):
...
如果您需要 CSRF,您可以查看启用 CSRF 的集成 jQuery 文件上传器的示例实现here。