Javascript 使用AngularJS和$http PUT在请求正文中上载文件

Javascript 使用AngularJS和$http PUT在请求正文中上载文件,javascript,angularjs,file,upload,Javascript,Angularjs,File,Upload,我正在通过一个API调用上传一个文件,该调用要求将文件放入请求主体中并使用PUT。使用下面的代码,我可以上传一些创建文件并返回200状态的东西。rawData长度正好是基于初始文件大小的预期长度。但是,创建的文件有一些附加字节,无法打开。例如,我上传的234 kb的jpg文件在上传后有352 kb,而12 kb的docx文件在上传后有17 kb var contentType = file.type; var reader = new FileReader();

我正在通过一个API调用上传一个文件,该调用要求将文件放入请求主体中并使用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);
除了使用undefined的“Content-Type”,我还使用了文件的Content-Type,但我有同样的问题

我尝试在FileReader上调用readAsArrayBuffer方法并传入一个rawData的UINT8数组,但这不会传入请求中的任何数据,并创建一个0字节的文件

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

是否有一些额外的编码等,我应该做发送正确的数据


提前谢谢

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

另外,由于$http服务已经返回承诺,因此不需要使用
$q.defer
创建承诺

此外,还提供了
.success
.error
方法


FileReader.readAsBinaryString()已弃用 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);
将二进制字符串转换为。这意味着128-255范围内的数据字节用2个字节编码。不要将二进制数据转换为DOMstrings。使用

FileReader.readAsBinaryString()文件 非标准的 此功能是非标准的,不在标准轨道上。不要在面向Web的生产站点上使用它:它不会适用于所有用户。实现之间也可能存在很大的不兼容性,并且行为可能会在将来发生变化

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

//reader.readAsBinaryString(file);

reader.readAsArrayBuffer(file)