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

2023-12-11

我需要上传一个包含一些数据的文本文件,来自我的local filesystem to say {{MEDIA_URL}}/uploadfolder.该文件将由我的函数之一处理django view.

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

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

});

当我使用 firebug 并尝试时

file=$('#fselect').get(0).files[0]

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

def storeAndProcessFile(request,file):
    pass

在介绍任何 javascript 之前,首先您应该了解文件通常如何使用 Django 上传和处理。考虑以下 html 形式:

<form method="post" action="/foo/url/">
    <input type="file" name="foofile">
    <input type="submit" value="Upload">
</form>

因此,当用户单击提交按钮时,浏览器会将该文件上传到/foo/url/使用HTTP方法POST。然后在 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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐