首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以通过JSON将文件的二进制数据上传到服务器?

是否可以通过JSON将文件的二进制数据上传到服务器?
EN

Stack Overflow用户
提问于 2017-04-01 14:11:24
回答 1查看 3.1K关注 0票数 0

我正在为SPL (软件生产线)创建一个体系结构,我需要使事情尽可能简单,以达到工业生产力的目的。该体系结构是RESTful,服务器端的Web,客户端的角度2&Matters2。

我只是有个问题

由于我编写了前端和后端,在具有文件上传控制的表单中,我是否可能从该文件中获取二进制数据,并将其与其他属性一起以JSON格式发送到服务器?

换句话说,我不想发送multipart/form-data,,而是发送如下内容:

代码语言:javascript
复制
{  
   "title":"we in the garden",
   "tags":[  
      "family",
      "holidy"
   ],
   "file":" is it possible to include file's binary data here? "
}

如果是,我错过了什么,如果没有,为什么不呢?

EN

回答 1

Stack Overflow用户

发布于 2017-04-01 16:42:32

可能但不建议

可以使用FileReader.readAsDataURL() API将文件作为base64编码字符串带入内存。

代码语言:javascript
复制
  vm.previewFile = function() {
    readBase64(vm.files[0]).then(function(data) {
      vm.data = data;
    })
  }  

  function readBase64(file) {
    var reader  = new FileReader();
    var future = $q.defer();

    reader.addEventListener("load", function () {
      future.resolve(reader.result);
    }, false);

    reader.addEventListener("error", function (event) {
      future.reject(event);
    }, false);

    reader.readAsDataURL(file);

    return future.promise;
  }

The PLNKR的演示。

然而,base64编码效率低下。将二进制文件转换为base64编码的DOMstring (UTF-16)将占用266%的内存。该浏览器可能会与大型视频文件崩溃。

更有效的方法是直接发布文件:

代码语言:javascript
复制
//RECOMMENDED
//Send binary file directly
var config = { headers: { "Content-Type": undefined },
               params: { filename: vm.files[0].name,
                         size: vm.files[0].size,
                         type: vm.files[0].type
                       } 
             );
$http.post(url, vm.files[0], config);

$http服务将使用XHR发送方法浏览器文件对象流发送到服务器。

代码语言:javascript
复制
<input type="file" files-input 
       ng-model="files" ng-change="previewFile()"
/>

files-input指令:

代码语言:javascript
复制
app.directive("filesInput", function() {
  return {
    require: "ngModel",
    link: function postLink(scope,elem,attrs,ngModel) {
      elem.on("change", function() {
        ngModel.$setViewValue(elem[0].files);   
      });
    }
  };      
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43157916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档