Django ajaxuploader 400 错误

0 投票
1 回答
559 浏览
提问于 2025-04-18 18:13

提交的HTML文件 JS代码被包裹在一个document.ready函数里

var uploader = new qq.FileUploader({
            action: "{% url 'QCOMLTE:imager' %}",
            element: $('#file-uploader')[0],
            multiple: true,
            onComplete: function(id, fileName, responseJSON) {
                if(responseJSON.success) {
                    alert("success!");
                } else {
                    alert("upload failed!");
                }
            },
            onAllComplete: function(uploads) {
                // uploads is an array of maps
                // the maps look like this: {file: FileObject, response: JSONServerResponse}
                alert("All complete!");
            },
            params: {
                'csrf_token': "{{  csrf_token }}",
                'csrf_name': 'csrfmiddlewaretoken',
                'csrf_xname': 'X-CSRFToken'
            }
        });

在HTML的其他部分

<div id="file-uploader">
    <noscript>
        <p>Please enable JavaScript to use file uploader.</p>
    </noscript>
</div>

urls.py文件

urlpatterns = patterns('',
                   url(r"^Submitted/$", views.HybridDetailView.as_view(), name='Submitted'),
                   url(r'^(?P<object_type>\w+)/process/$', views.process, name='process'),
                   url(r'^(?P<object_type>\w+)/$', views.generic_view, name='generic'),
                   url("$^", views.head, name='head'),
                   url("uploader", views.upload, name= 'imager'),
)

views.py文件

@AjaxFileUploader
def upload(request):
    response = {'files': []}
    script_dir = os.path.dirname(__file__)
    # Loop through our files in the files list uploaded
    print('request',request)
    print(request.FILES)
    for item in request.FILES.getlist('files[]'):
        file = UploadedFile(item)
        with open(script_dir + '/Excel/' + file.name) as destination:
            for chunk in file.chunks():
                destination.write(chunk)
        response['files'].append(file)
        print('appended')

return HttpResponse(json.dumps(response), content_type='application/json')

还在已安装的应用列表中包含了'ajaxuploader'

当我尝试通过按钮提交一个文件时,它发送了一个POST请求,但收到一个400(错误请求)错误。 从我能看出来,它甚至没有到达Python代码,至少没有到达视图代码。请求的URL似乎是正确的

http://localhost:8000/QCOMLTE/uploader?qqfile=powered_by.png

而当你访问这个URL时,会收到一条消息,说明只允许POST请求。 这和默认的django-ajax-uploader与s3后端给出的MalformedXML错误类似, 但我并没有使用任何后端,只是想获取文件并保存到一个目录。

更新 2014年8月25日: 从视图中移除了装饰器。这样做后,错误没有被发送。打印请求后,很明显文件被发送到了GET路径,而不是FILE路径。我不知道该怎么改变这个。

1 个回答

0

在找到这个 需要一个简单的Django文件上传示例 后,我开始尝试模仿它,结果发现文件和POST请求实际上是成功发送的,这和我之前使用的ajax/jquery不一样。我的JQuery代码是

       $('#uploadform').submit(function (e){
            console.log('submitting')
            var data = new FormData($('#uploadform').get(0));

            $.ajax({
                type: 'POST',
                url: "{% url 'QCOMLTE:imager' %}",
                data: data,
                success: function(data){console.log(data)},
                error: function(data){console.log(data)},
                cache: false,
                processData: false,
                contentType: false
            });
            e.preventDefault()
        });

不过类型是在URL下面。我尝试把它改成$.post请求,结果它试图发送到错误的URL……所以我决定把它改回来,这次把类型放在ajax调用的最上面。这样就成功了……经过多次测试,它依然有效。

撰写回答