angularJS 从 base64 制作二进制数据图像并作为图像文件发送到服务器

Posted

技术标签:

【中文标题】angularJS 从 base64 制作二进制数据图像并作为图像文件发送到服务器【英文标题】:angularJS make binary data image from base64 and send as image file to server 【发布时间】:2015-01-25 14:23:28 【问题描述】:

我正在使用这个工具在我的 AngularJS 应用程序中裁剪图像:https://github.com/fengyuanchen/cropper

然后我尝试将数据存储到服务器,但现在我发送 base64 代码...如何发送正常的裁剪图像二进制代码,而不是 base64?是真的吗?

我的上传代码是这样的:

var addImage = function(files) 
      var deferred = $q.defer();
      var fd = new FormData();      

      var blob = new Blob([files],  type : "image/png");
      fd.append("file", blob);

      $http.post(settings.apiBaseUri + "/files", fd, 
          withCredentials: true,
          headers: 
            'Content-Type': undefined
          ,
          transformRequest: angular.identity
        )
        .success(function(data, status, headers, config) 
          url = data.Url;
          deferred.resolve(url);
        )
        .error(function(err, status) 

        );
      return deferred.promise;
    ;

我在这里发送 base64 代码:

  $scope.photoChanged = function(files) 
    $scope.oldImg = angular.element(document.querySelector('#avatar-id'));
    $scope.files = files;        
    var reader = new FileReader();
    reader.onload = function(e) 
      $scope.imagecontent = e.target.result;
    ;
    reader.readAsDataURL(files[0]);
  ;

  $scope.setCroppedData = function(data) 
    $('#avatar-id').attr('src', data);
    $scope.nImg = new Image();
    $scope.nImg.src = data;  // data - is base64 image code
  
  ...
  uploaderService.addImage($scope.nImg.src).then(function(url) 
    $scope.person.AvatarUrl = url;
    $scope.updateContactQuery();
  );
  ...

如何在没有任何裁剪的情况下像我一样发送:发送图像文件,以便我可以通过浏览器中的链接查看图像,但不是 byte64 代码???

【问题讨论】:

发送base64并在服务器端使用图像处理功能创建图像文件并保存不是更容易吗? @geekman no - 服务器不会改变... 我不明白你到底想做什么。您想将图像保存到服务器还是简单地显示在页面上? 找到了这个天才解决方案:blog.danguer.com/2011/10/24/… 【参考方案1】:

您可以将 base64 数据包装在 ArrayBuffer 中,然后转换为二进制图像数据,例如:

var binaryImg = atob(base64Image);
var length = binaryImg.length;
var arrayBuffer = new ArrayBuffer(length);
var uintArray = new Uint8Array(arrayBuffer);
for (var i = 0; i < length; i++) 
    uintArray[i] = binaryImg.charCodeAt(i);

我想uintArray 是你想要的。

【讨论】:

请添加查询示例 “查询示例”是什么意思?看来你的问题是how to send normal cropped image binary 我的意思是发布 http 查询。可以作为 param uintArray 发送吗? @brabertaser1992 抱歉,我不确定。但是你可以参考这个library(第30-70行)关于如何将文件二进制发送到后端服务器。如果我有任何想法,我会更新我的答案。 在 'Window' 上执行 'atob' 失败:要解码的字符串没有正确编码。

以上是关于angularJS 从 base64 制作二进制数据图像并作为图像文件发送到服务器的主要内容,如果未能解决你的问题,请参考以下文章

什么是Base64算法

Python从base64转换为二进制

base64编解码与hash加密

(二)base64编码的前世今生

从 HTML5 Canvas (readAsBinaryString) 获取二进制 (base64) 数据

使用 AngularJs 将 base64 格式的数据转换为图像