Angularjs,file upload和IE9

在Angularjs / Nodejs应用程序中有file upload问题。

我实现了这个angular度file upload指令。 使用它,file upload工作在所有现代浏览器,但在IE9失败。 通过“失败”我的意思是,它的行为就像它的工作…我可以loggingfile upload进度,并看到它逐步达到100%,成功处理程序触发成功的日志消息(没有在触发error handling程序),但该文件永远不会出现在上传目录中(在同一台机器上)。

没有任何控制台错误,我设置上传目录权限为777,以排除这一点。

我发现的东西是closures的…首先,IE9上传的文件永远不会触发我放在我的uploadPhoto函数的日志消息,所以路线似乎甚至没有打(认为上载在现代浏览器的文件会触发这些日志消息)。 此外,在上传之后,在开发人员工具的networking面板中,types的值不应该是text / html,如下所示。

(下面的地图: URL, Method, Result, Type, Received ):

 /path/to/upload-dir/filename.jpg GET 200 text/html 20.7kb 

这是我的file upload处理程序:

 $scope.onFileSelect = function ($file) { $scope.ajaxVisible = true; $scope.uploadError = false; var photo = $file[0]; $scope.upload = $upload.upload({ url: '/upload/photo', file: photo, method: 'POST' }).progress(function (evt) { }).success(function (data, status, headers, config) { $scope.toggleUploadForm(); $scope.imgsrc = 'path/to/upload/dir/' + photo.name; User.currentUser.profile_image = photo.name; User.updateUser(); $scope.ajaxVisible = false; }).error(function (err) { $scope.uploadError = true; $scope.ajaxVisible = false; }); }; 

这是该路由的处理程序(expressjs / node):

 app.post('/upload/photo', userAPI.uploadPhoto); 

这是在路由处理程序中引用的uploadPhoto:

 exports.uploadPhoto = function(req, res) { logger.info('inside uploadPhoto'); // <-- never reached using IE9 var callbacks = {}; callbacks.uploadSuccess = function(){ res.json('success'); }; callbacks.uploadFailure = function(err){ res.json(400, 'Error uploading image.'); }; user.handlePhotoUpload(req.files, callbacks); }; 

哪一个,最后,把事情交给:

 this.handlePhotoUpload = function(params, callbacks) { logger.log('inside handlePhotoUpload'); // <-- never reached using IE9 if(params.file.mime !== 'image/png' && params.file.mime !== 'image/jpeg' && params.file.mime !== 'image/gif') { callbacks.uploadFailure('Wrong file type'); return; } fs.readFile(params.file.path, function(err, data){ if(err){ callbacks.uploadFailure(err); } var newPath = path.resolve("./path/to/upload/dir/" + params.file.filename); fs.writeFile(newPath, data, function(err) { if(err){ callbacks.uploadFailure(err); } callbacks.uploadSuccess(); }); }); }; 

该指令利用后端的FileAPI库 ,并要求Flash来处理上传过程。 我认为Flash是问题的根源。 我错过了一些东西,但不知道它可能是什么。

正如我所说,在控制台(在任何浏览器)和file upload没有错误显示所有的工作迹象,除了该文件永远不会出现在上传目录。 但是,通过IE9上传时,通过现代浏览器上传的各种日志语句永远都不会到达。

关于如何解决这个问题的build议与解决scheme的build议一样受欢迎。

所以我解决了这个问题 罪魁祸首是在我自己的代码(自然…叹了口气),是这样的:

 if(params.file.mime !== 'image/png' && params.file.mime !== 'image/jpeg' && params.file.mime !== 'image/gif') { callbacks.uploadFailure('Wrong file type'); return; } 

由于此指令使用Flash作为其后备上传(对于旧的,不起眼的浏览器,如IE <= 9),上传的MIMEtypes实际上是application/octet-stream …不是在上述代码中检查的图像MIMEtypes之一。 所以添加MIMEtypes到我的支票允许图像被上传的Flash(因此,IE <= 9)。

此外,我没有正确地使用我的日志中的错误消息“错误的文件types”。 我有:

 callbacks.uploadFailure = function(err){ res.json(400, 'Error uploading image.'); }; 

正如你所看到的,不会使用err以便在logging错误时消除特定的,内容丰富的错误消息,并且只获取相对通用的“错误上传映像”。