上传文件 angular
在使用AngularJS时,上传文件(Upload files angular)的问题可能出现的原因是:在传递文件给服务时,文件的类型是数组,而不是单个文件。
解决这个问题的方法是:
1. 在HTML中使用<input id="fileupload" type="file" name="files" file-model="myFile">
定义文件上传的input标签,并使用file-model
指令。
2. 在AngularJS的指令中定义file-model
指令,将文件赋值给myFile
变量。
3. 在控制器中定义$scope.myFile = null;
来接收文件的细节/文件。
4. 在传递文件给服务时,需要将文件数组中的第一个文件传递给服务。可以使用以下代码:
this.uploadFile = function(file) { var fd = new FormData(); fd.append('file', file[0]); var d = $q.defer(); $http.post(uploadUrl, fd, { transformRequest: angular.identity, headers: { 'Content-Type': undefined } }) .success(function(response) { d.resolve(response); }) .error(function(response) { d.reject(response); }); return d.promise; };
5. 对于解决方案的修改:可以使用以下代码:
var filedata = document.getElementsByName("file"), formdata = false; if (document.FormData) { formdata = new FormData(); } var i = 0, len = filedata.length, img, reader, file;
不需要使用.files
来获取文件数据,因为fileData
已经包含了所有的文件。
以上是解决AngularJS上传文件问题的方法。
问题出现的原因是在代码中返回了所有已上传的文件,即使只有一个文件。而且,当尝试访问filedata
的files
属性时,返回的是undefined,因为files
属性只能从该数组中的单个元素获取。
解决方法是将代码中的这一行进行修改:
var i = 0, len = filedata.files.length, img, reader, file;
修改为:
var i = 0, len = filedata[0].files.length, img, reader, file;
此外,还需要将以下这一行进行修改:
file = filedata.files[i];
修改为:
file = filedata[0].files[i];
或者,如果可能有多个文件被提交,还可以添加一个for
循环,遍历filedata
中的每个文件。