我想用AngularJs上传一个文件(如此图像)...我读过AngularJs不支持标签输入类型="文件"所以我读到我需要自定义指令...我想获取输入文件并将其用于同一页面上的节目预览(缩略图)和控制器上传服务器上的文件...在我的页面html中我写了这段代码:
<body ng-controller="myController">
<h1>Select file</h1>
<input type="file" file-model="myFile" />
<div>
<h2>File content is:</h2>
<pre>{{ content }}</pre>
</div>
</body>
我写了这个指令:
var modulo = angular.module('myApp', []);
modulo.directive('fileModel', function () {
return {
restrict: 'A',
link: function(scope, element, attrs) {
element.on('change', function (event) {
var file = event.target.files[0];
scope.$emit("fileSelected", file);
});
}
};
});
这是我的控制者:
modulo.controller('myController', function ($scope) {
$scope.$on('fileSelected', function (event, args) {
$scope.content(args.file);
console.log(args.file);
});
});
这段代码不起作用......有解决方案吗?错误在哪里?
答案 0 :(得分:1)
错误在您的指令
中检查一下,我在我的应用程序中使用了相同的指令
.directive('fileModel', ['$parse', function ($parse) {
return {
restrict: 'A',
link: function(scope, element, attrs) {
var model = $parse(attrs.fileModel);
var modelSetter = model.assign;
element.bind('change', function(){
scope.$apply(function(){
modelSetter(scope, element[0].files[0]);
});
});
}
};
}
this is my html to
input(type="file", file-model="myFile", accept="image/*", image="image", id='fileInput')
这是我为处理上传而创建的一项小型服务
function fileUpload (file, uploadUrl) {
var cropedImage = dataURItoBlob(file);
var fileData = new FormData(),
uploadedImage = '';
fileData.append('fileUpload', cropedImage);
return $http({
withCredentials: true,
method: "POST",
url: uploadUrl,
data: fileData,
headers: {'Content-Type': undefined},
transformRequest: angular.identity
});
}
试试这个,它为我工作
答案 1 :(得分:0)
您应该执行以下操作来显示图像:
<pre><img data-ng-src="data:image/png;base64,{{ content }}"/></pre>
要从输入中检索数据,您应该使用自定义指令,如this answer中所示:
angular.module('appFilereader', []).directive('appFilereader', function($q)
{
var slice = Array.prototype.slice;
return {
restrict: 'A',
require: '?ngModel',
link: function(scope, element, attrs, ngModel) {
if (!ngModel) return;
ngModel.$render = function() {};
element.bind('change', function(e) {
var element = e.target;
$q.all(slice.call(element.files, 0).map(readFile))
.then(function(values) {
if (element.multiple) ngModel.$setViewValue(values);
else ngModel.$setViewValue(values.length ? values[0] : null);
});
function readFile(file) {
var deferred = $q.defer();
var reader = new FileReader();
reader.onload = function(e) {
deferred.resolve(e.target.result);
};
reader.onerror = function(e) {
deferred.reject(e);
};
reader.readAsDataURL(file);
return deferred.promise;
}
); //change
在你的HTML中:
<input type="file" ng-model="editItem._attachments_uri.image"
accept="image/*" app-filereader />