如何在angularjs中上传已经在<img src>中的图像

Posted

技术标签:

【中文标题】如何在angularjs中上传已经在<img src>中的图像【英文标题】:How to upload image which is already in <img src> in angularjs 【发布时间】:2016-02-26 13:21:37 【问题描述】:

我有一个显示在&lt;img ng-src=''&gt; 中的现有图像,我想在单击提交按钮时上传(与我的其他 json 对象一起发布)它。该图像已存在,因此我不需要使用&lt;input type ="file"&gt;。但是我拥有的代码不起作用。谁能帮助我如何实现这一目标。非常感谢。

plunker link

【问题讨论】:

【参考方案1】:

已经有一段时间了,但是我只想展示我是如何实现类似功能的

演示

plnkr

行动计划

img/URL 转换为Base64 格式。 将Base64 数据作为属性添加到scope

采取的步骤

创建了一个工厂来使用画布和承诺将 URL 转换为 Base64。 修改了fileInput 指令,以便在图像load 事件上,它将img 转换为Base64 并在scope 上分配imgData 属性。 使用imgData 属性,将Base64 编码字符串附加到formData

指令

link: function(scope, ele, attrs) 
  ele.bind('load', function(e) 
    var imgSrc = e.target.src;
    urlToBase64.getData(imgSrc).then(function(data) 
      scope.imgData = data;
    );
    scope.$apply();
  );

工厂

myApp.factory('urlToBase64', ['$q', function($q) 

  var obj = ;
  // function to convert URL to Base64 representation
  function URLtoBase64(url, callback) 
    var defer = $q.defer();

    var img = new Image();
    img.crossOrigin = 'Anonymous';
    img.onload = function() 
      var canvas = document.createElement('CANVAS');
      var ctx = canvas.getContext('2d');
      canvas.height = this.height;
      canvas.width = this.width;
      ctx.drawImage(this, 0, 0);
      try 
        defer.resolve(canvas.toDataURL());
       catch (e) 
        defer.reject(e);
      
      canvas = null;
    ;
    img.src = url;

    return defer.promise;
  

  obj.getData = URLtoBase64;
  return obj;
]);

控制器

var fd = new FormData();
// imgData is coming from fileInput directive
fd.append('file', $scope.imgData);
fd.append('formdata', JSON.stringify($scope.dataform));
var reqObject = 
  url: 'admin/managecuisineAdd',
  method: 'POST',
  data: fd,
  transformRequest: angular.identity,
  headers: 
    'Content-type': undefined
  
;
$http(reqObject).then(function(data) 
  $scope.status = data;
  $scope.itemlist.push(data)
  $scope.message = "New Dish Added Successfully"
);

【讨论】:

以上是关于如何在angularjs中上传已经在<img src>中的图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在angularjs上传图像时自动压缩图像

如何在angularjs中使用ng-file上传裁剪和上传图像

angularjs上传图片和文件

Angularjs - 加载多次的相同图像

AngularJS之WebAPi上传

Angularjs如何上传多部分表单数据和文件?