【问题标题】:Convert base64 to image file in AngularJS在AngularJS中将base64转换为图像文件
【发布时间】:2016-03-09 15:17:10
【问题描述】:

我正在使用ngImgCrop 插件进行图像裁剪并发布到我的休息服务。像这样的 HTML:

<form>
          <button class="btn btn-default fileUpload" type="submit"><span>from pc</span>
            <input type="file"
                   id="fileInput"
                   class="upload"
                   onchange="angular.element(this).scope().uploadFile(this.files[0])"/></button>
          <button class="btn btn-default" type="submit">from camera</button>

          <div class="cropArea">
            <img-crop image="image.myImage" result-image="image.myCroppedImage"></img-crop>
          </div>
          <div class="hidden"><img ng-src="{{image.myCroppedImage}}" ng-model="updatedPhoto" /></div>
          <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal" ng-click="closeThisDialog(value)">Close
            </button>
            <button type="submit" ng-click="updatePhoto()" class="btn btn-primary">Save</button>
        </form>

还有controller.js:

$scope.updatePhoto = function () {
      var updatedPhotoLink = {
      file: file
    };
      $http({
        method: 'POST',
        data:  updatedPhotoLink,
        url: '//myapiservices.com/upload'
      }).then(function successCallback(response) {
       console.log(response);
      }, function errorCallback(response) {
        console.log("error");
        // called asynchronously if an error occurs
        // or server returns response with an error status.
      });
    }

是的,它可以工作,但图片链接通过 base64 返回,但 API 链接希望通过文件返回。

我尝试添加以进行更改:

      var imageBase64 = $scope.image.myCroppedImage;
      var blob = new Blob([imageBase64], {type: 'image/png'});

但它不起作用,图像文件返回空白。如何将base64 url​​转换为文件?谢谢。

【问题讨论】:

    标签: javascript angularjs input base64


    【解决方案1】:

    查看this link

    function getBase64Image(base64string) {
        return base64string.replace(/^data:image\/(png|jpg);base64,/, "");
    }
    var imgData = JSON.stringify(getBase64Image(/* base64string */));
    $.ajax({
    url: 'http://url.com/rest/api',
    dataType: 'json',
    data: imgData,
    type: 'POST',
     success: function(data) {
      console.log(data);
    }
    });
    

    这是一个上传图片base64到服务器的例子, 它与你所做的有点不同,但它可以解决问题。

    您只发送base64 而不是发送图像的href,而在转换base64 的开头没有元数据。您定义为contentType:json 并将其发送到服务器。

    在服务器端,您获得 base64(实际上是一个表示位数组的字符串)并将其转换为图像 (php convert base64)

    【讨论】:

      【解决方案2】:

      尝试以下方法:

      <img data-ng-src="data:image/png;base64,{{image.myCroppedImage}}" ng-model="updatedPhoto" />
      

      【讨论】:

      • 不,我需要图像文件。
      【解决方案3】:
       $scope.uploadFileCropper = function () {
              debugger;
              var imageBase64 = $(".cropped")[0].src;
              var blob = this.dataURItoBlob(imageBase64);
              var blobimage = new File([blob], 'image.png');
              if (blobimage != "") {
                  var file = blobimage;
                  var payload = new FormData();
                  payload.append("file", file);
                  //data.my_imageurl = $(".cropped")[0].src;
                  uploadSUFileService.uploadFile('your API Route', payload).then(function (response) {
                      $(".MKloader").fadeOut("slow");
                      if (response.status == 200) {
                          $scope.ProductLines.my_imageurl = response.data;
                          document.getElementById('image').src = $scope.ProductLines.my_imageurl;
                          $scope.updatedataimageURl();
                      } else if (response.status == 203) {
                          console.log(status);
                          location.replace("/Signin");
                      } else if (response.status == 204) {
                          console.log(status);
                          alert("Record not updated")
                      }
                  }).catch(function (response) {
      
                      console.log(response);
                      $(".MKloader").fadeOut("slow");
                  });
              }
          }
      
       $scope.dataURItoBlob = function (dataURI) {
              var byteString = atob(dataURI.toString().split(',')[1]);
      
              //var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
      
              var ab = new ArrayBuffer(byteString.length);
              var ia = new Uint8Array(ab);
              for (var i = 0; i < byteString.length; i++) {
                  ia[i] = byteString.charCodeAt(i);
              }
              var blob = new Blob([ab], { type: 'image/png' }); //or mimeString if you want
              return blob;
          }
      

      【讨论】:

      • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
      【解决方案4】:

      你添加了这个:

      var imageBase64 = $scope.image.myCroppedImage;
      var blob = new Blob([imageBase64], {type: 'image/png'});
      

      现在有一些变化:

      var imageBase64 = $scope.image.myCroppedImage;
      var blob = this.dataURItoBlob(imageBase64);
      var image = new File([blob], 'image.png');
      

      并添加此功能:

      dataURItoBlob(dataURI) {
          var byteString = atob(dataURI.toString().split(',')[1]);
      
          //var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
      
          var ab = new ArrayBuffer(byteString.length);
          var ia = new Uint8Array(ab);
          for (var i = 0; i < byteString.length; i++) {
              ia[i] = byteString.charCodeAt(i);
          }
          var blob = new Blob([ab], {type: 'image/png'}); //or mimeString if you want
          return blob;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-23
        • 1970-01-01
        • 1970-01-01
        • 2017-09-24
        • 2015-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多