我正在尝试以角度在同一请求中上传(发布)文件及其文件名,然后在Flask中接收它并写入光盘。使用以下命令从本地光盘读取文件:
reader.readAsArrayBuffer(importData.ruleFile.files[0]);
http请求是:
$http({
url: baseUrlService.baseURL + 'importtifile',
method: 'POST',
headers: {'Content-Type': undefined},
data: {
filename: importData.ruleFileName,
// filedata: new DataView(reader.result)
// filedata: reader.result
filedata: new Uint8Array(reader.result)
},
transformRequest: function (data, headersGetter) {
var formData = new FormData();
formData.append('filename', data.filename);
formData.append('filedata', data.filedata);
return formData;
}
}).then(
...
烧瓶部分是:
@api.route('/importfile', methods=['POST'])
def import_file():
file_name = request.form['filename']
file_data = request.form['filedata']
f = NamedTemporaryFile(delete=False)
f.write(file_data)
f.close()
问题是:
当我从angular发送文件新DataView(reader.result)时,服务器写入的文件只包含一个字符串:
[object DataView]
如果我将其作为新 Uint8Array(reader.result)发送,则服务器写入的文件只包含字符串:
[object Uint8Array]
如何传输实际数据?
我尝试读取文件readAsBinaryString,但在这种情况下,在服务器端写入的文件大约是原始文件的两倍。
提前感谢您的帮助。
答案 0 :(得分:0)
最后,我发现我需要转移的是Blob:
angularJS:
// Send file as Blob along with its filename
$http({
url: baseUrlService.baseURL + 'importtifile',
method: 'POST',
headers: {'Content-Type': undefined},
data: { filedata: fileBlob },
uploadEventHandlers: {
progress: function(e) {
importData.fileUploadProgress = e;
console.log(importData.fileUploadProgress);
}
},
transformRequest: function (data, headersGetter) {
var formData = new FormData();
formData.append('fileblob', data.filedata);
return formData;
}
}).then(
...
在烧瓶部分,可以提取文件blob和名称:
@api.route('/importfile', methods=['POST'])
def import_file():
file_obj = request.files['fileblob']
和 file_obj.filename 将包含文件名。