Django ajaxuploader 400 错误
提交的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调用的最上面。这样就成功了……经过多次测试,它依然有效。