在AngularJS和Flask中的同一请求中发布二进制文件和名称

时间:2016-07-19 09:01:01

标签: python angularjs http flask blob

我正在尝试以角度在同一请求中上传(发布)文件及其文件名,然后在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,但在这种情况下,在服务器端写入的文件大约是原始文件的两倍。

提前感谢您的帮助。

1 个答案:

答案 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 将包含文件名。