【问题标题】:using javascript and django to upload a text file to some folder in server使用 javascript 和 django 将文本文件上传到服务器中的某个文件夹
【发布时间】:2012-05-12 03:55:46
【问题描述】:

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

我在我的 html 页面中创建了一个<input type="file" id="fselect" >。我创建了一个 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 python django


    【解决方案1】:

    在我进入任何 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

    【讨论】:

    • ,感谢您的回复...我会尝试是否可以使用 jquery 来发帖,然后从 django view 的 request.FILES 中获取文件 ..非常感谢您的详细解释
    • 我建议先用一个简单的表单让它在没有 javascript 的情况下工作,然后一旦工作,添加 js。
    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 2017-02-15
    • 2015-02-27
    • 1970-01-01
    • 2013-11-14
    • 2018-04-21
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多