Javascript 使用AngularJs上载文件/图像
我想用AngularJs上传一个文件(so图像)…我读到AngularJs不支持标记输入type=“file”,所以我读到我需要自定义指令…我想获取输入文件并将其用于在同一页面html上显示预览(缩略图)和在控制器中在服务器上上传文件…在我的页面html中,我编写了以下代码:Javascript 使用AngularJs上载文件/图像,javascript,jquery,angularjs,file-upload,angularjs-directive,Javascript,Jquery,Angularjs,File Upload,Angularjs Directive,我想用AngularJs上传一个文件(so图像)…我读到AngularJs不支持标记输入type=“file”,所以我读到我需要自定义指令…我想获取输入文件并将其用于在同一页面html上显示预览(缩略图)和在控制器中在服务器上上传文件…在我的页面html中,我编写了以下代码: <body ng-controller="myController"> <h1>Select file</h1> <input type="file" file-model="m
<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>
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
这是我的控制器:
<pre><img data-ng-src="data:image/png;base64,{{ content }}"/></pre>
这个代码不起作用…有解决方案吗?错误在哪里?您应该执行以下操作来显示图像: 在您的html中:
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
});
}
错误在您的指令中 检查此项,我在我的应用程序中使用了相同的指令 这是一个小服务,我已经创建了处理上传
试试这个,它对我有效从你发布的代码来看,它似乎缺少一个ng应用声明-将ng应用放在body标签上,如:我在本例中省略了,因为它被服务对不起,你能帮我处理代码吗?因为它必须运行…如果我以这种方式在directi中定位un-allert alert(文件);我获取[object File],这样我就可以获取文件,并读取名称、大小和上次修改的内容。当我传递作用域为.emit(“fileSelected”,file)的文件时;我在我的控制器中获取这个值…如果我尝试在我的html页面和控制台中显示文件,我会在控制台中获得“未定义”…为什么?谢谢对不起,你能评论一下代码吗?另外,如何将文件/imge from指令传递给控制器以显示图像预览?谢谢@user3751473我使用以下命令将文件/图像from指令传递给我的控制器函数angular.element(document.querySelector(“#fileInput”)。on('change',handleFileSelect);我的控制器var handleFileSelect=function(selectedFile){$scope.showCropSection=true;var file=selectedFile.currentTarget.files[0];var reader=new FileReader();reader.onload=function(selectedFile){$scope.$apply(function($scope){$scope.myImage=selectedFile.target.result;});};reader.readAsDataURL(文件);};
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
<input type="file" ng-model="editItem._attachments_uri.image"
accept="image/*" app-filereader />
.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
});
}