使用XMLHtttpRequest将照片上传到Flask网络服务器
问题描述:
我创建了WinJS应用程序并使用XMLHttpRequest将照片作为blob发送到Flask网络服务器。使用XMLHtttpRequest将照片上传到Flask网络服务器
openPicker.pickSingleFileAsync().then(function (file) {
file.openAsync(Windows.Storage.FileAccessMode.read).done(function (stream) {
var blob = MSApp.createBlobFromRandomAccessStream("application/octet-stream", stream);
var fdata = new FormData();
fdata.append("file", blob, "photo.jpg");
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "http://127.0.0.1:5000/api/addPhoto", true);
xmlhttp.setRequestHeader("Content-type", "multipart/form-data");
xmlhttp.send(fdata);
});
});
这导致以下HTTP请求:
POST http://127.0.0.1:5000/api/addPhoto HTTP/1.1
Accept: */*
Content-Type: application/octet-stream, multipart/form-data; boundary=---------------------------7dd2a320aa0ec0
Accept-Language: en-US,en;q=0.7,ja;q=0.3
UA-CPU: AMD64
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0; MSAppHost/1.0)
Host: 127.0.0.1:5000
Content-Length: 9471100
Connection: Keep-Alive
Pragma: no-cache
-----------------------------7dd2a320aa0ec0
Content-Disposition: form-data; name="file"; filename="photo.jpg"
Content-Type: application/octet-stream
处理瓶Web服务器
UPLOAD_FOLDER = '/images'
@app.route('/api/addPhoto', methods=['POST'])
def addPhoto():
if request.method == 'POST':
f = request.files['file']
if f and allowed_file(f.filename):
return "error" #add error response here
else:
filename = secure_filename(f.filename)
f.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
f.close
return "ok" #add success response here
,我发现了以下错误的请求:
TypeError: 'ImmutableMultiDict' object is not callable
我有几个问题我无法找到答案:
- 我是否以正确的格式发送数据?我是否正确地将数据附加到表单中?
- 我的HTTP内容类型是否正确?
- 我试图从HTTP请求错误地拉文件?
谢谢!
答
尝试更换此:
f = request.files('file')
有:
f = request.files['file']
+0
啊 - 我原来是这样的,但后来改变了它。我改回了它(见上文)。现在我得到以下错误:引发BuildError(端点,值,方法)。 –
+0
那么你应该指出栈跟踪指向哪一行。 – mata
在哪里出现了类型错误: 'ImmutableMultiDict' 对象不是可调用的?你能发布完整的堆栈跟踪吗?幸运的是,这看起来只是一些Flask/Python错误,而不是一些奇怪的HTTP问题,至少要开始。 此外,如果您不使用pdb,这里可能会有所帮助......只需在顶部输入pdb,然后在您的处理程序开始处输入pdb.set_trace(),然后逐步进行调试。 –
您的内容类型标题对我来说似乎是错误的,为什么它在'multipart/form-data'之前有'application/octet-stream'。 – Musa