使用javascript和django将文本文件上传到服务器中的某个文件夹

dam*_*mon 2 javascript python django

我需要上传一个包含一些数据的文本文件,我local filesystem要说{{MEDIA_URL}}/uploadfolder.这个文件将由我django视图中的一个函数处理.

<input type="file" id="fselect" >在我的html页面中创建了一个.我创建了一个javascript文件,我试着调用上传函数,如下所示

 $(document).ready(function(){
      ...
      $('#fselect').change(function(){ 
         file=$('#fselect').get(0).files[0];
         uploadFile(file);
      }

});
Run Code Online (Sandbox Code Playgroud)

当我使用萤火虫,并尝试

file=$('#fselect').get(0).files[0]
Run Code Online (Sandbox Code Playgroud)

我能够获取File对象,它是使用input元素选择的文本文件.如何使用此File对象调用django视图?在django视图中,此File对象将是什么数据类型?

def storeAndProcessFile(request,file):
    pass
Run Code Online (Sandbox Code Playgroud)

mik*_*725 8

在进入任何javascript之前,首先应该了解如何使用Django上传和处理文件.请考虑以下html表单:

<form method="post" action="/foo/url/">
    <input type="file" name="foofile">
    <input type="submit" value="Upload">
</form>
Run Code Online (Sandbox Code Playgroud)

因此,当用户单击"提交"按钮时,浏览器会将该文件上载到/foo/url/使用HTTP方法POST.然后在Django的服务器端,url /foo/url/将映射到某个视图.在你的情况下它将是storeAndProcessFile.所以视图必须做的是获取上传的文件并将其存储到磁盘(或可能是其他存储系统).

现在,视图不会将文件作为您在问题中显示的函数参数之一.这是因为如何在HTTP请求中传递GET,POST和FILE数据.因此该文件实际上是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')
Run Code Online (Sandbox Code Playgroud)

这段代码几乎不属于Django文档.如果您想了解更多信息,可以在此处阅读.

至于Javascript,有大量的jQuery插件,可以使用ajax甚至多个文件一次上传文件.我真的很喜欢这个图书馆.它有许多功能,包括发送多个文件.然而,如果这太多了你可以只搜索jQuery文件上传插件,并且有很多但我最近没有测试任何其他,所以不能给出任何建议.

但是,在向Django站点(即CSRF)发出ajax请求时,需要记住一件事.自Django 1.2.5以来,他们改变了CSRF的验证方式,并且可以打破许多上传库.如果您不需要担心它,您可以随时添加csrf_exempt装饰器:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def storeAndProcessFile(request):
    ...
Run Code Online (Sandbox Code Playgroud)

但是,如果您需要CSRF,可以查看在此处启用CSRF的集成jQuery文件上传器的示例实现.