使用AngularJS和$ http PUT

时间:2017-03-06 20:31:48

标签: javascript angularjs file upload

我通过API调用上传文件,该调用需要将文件放在Request主体中并使用PUT。使用以下代码,我可以上传创建文件的内容并返回200状态。 rawData长度恰好是基于初始文件大小的预期长度。但是,创建的文件有一些额外的字节,无法打开。例如,我在234 kb上传的jpg文件在上传后有352 kb,而从12 kb开始的docx文件在上传后有17 kb。

        var contentType = file.type;
        var reader = new FileReader();
        reader.onload = function (e) {
            var rawData = reader.result;

            $http({
                url: appSettings.serverPath + '/File/' + fileId + '/Content',
                method: 'PUT',
                headers: { 'Content-Type': undefined },
                data: rawData,
                transformRequest: []
            }).success(function (data, status, headers, config) {
                deferred.resolve(data);
            }).error(function (error) {
                deferred.reject(error);
            });

        };

        reader.readAsBinaryString(file);

除了使用未定义的'Content-Type'之外,我还使用了文件的内容类型,但我遇到了同样的问题。

我尝试在FileReader上调用readAsArrayBuffer方法并传入rawData的Uint8Array,但是它不传递Request上的任何数据并创建一个0字节的文件。

我还尝试在FileReader上调用readAsDataURL方法,该方法对数据进行完全不同的编码,这样我的rawData和生成的文件对于jpg来说是313 kb。该文件仍然已损坏,无法打开。

我是否应该采取一些额外的编码来发送正确的数据?

提前致谢!!

1 个答案:

答案 0 :(得分:0)

无需使用FileReader API来读取文件。 XHR Send Method自动序列化文件对象,因为它们是Blob object的特殊类型。

    //var contentType = file.type;
    //var reader = new FileReader();
    //reader.onload = function (e) {
    //    var rawData = reader.result;

    return $http({
        url: appSettings.serverPath + '/File/' + fileId + '/Content',
        method: 'PUT',
        headers: { 'Content-Type': undefined },
        //data: rawData,
        data: file
        //transformRequest: []
    };
    /*  }).success(function (data, status, headers, config) {
            deferred.resolve(data);
        }).error(function (error) {
            deferred.reject(error);
        });
    */

    //reader.readAsBinaryString(file);

此外,无需使用$q.defer制作承诺,因为$ http服务已经返回承诺。

.success.error方法也是deprecated and removed from Angular V1.6.

FileReader.readAsBinaryString()已弃用

rawData长度恰好是基于初始文件大小的预期长度。但是,创建的文件有一些额外的字节,无法打开。例如,我在234 kb上传的jpg文件在上传后有352 kb,而从12 kb开始的docx文件在上传后有17 kb。

//reader.readAsBinaryString(file);

reader.readAsArrayBuffer(file)

XHR Send Method将二进制字符串(DOMstring)转换为UTF-8。这意味着128-255范围内的数据字节用2个字节编码。不要将二进制数据转换为DOMstrings。使用ArrayBuffer API

  

FileReader.readAsBinaryString()

     

非标准

     

此功能不符合标准,不符合标准。不要在面向Web的生产站点上使用它:它不适用于每个用户。实现之间可能存在很大的不兼容性,并且行为可能在将来发生变化。

     

[It]现已根据W3C 2012年7月12日的工作草案弃用。

     

— MDN Developer Reference - Web APIs - FileReader.readAsBinaryString()