为什么使用angular发送文件如此困难?[关闭]


18

我必须将文件(非常大的文件)发送到服务器。我正在研究我有什么选择以及如何做。我正在使用angular + express + nodejs。

如果使用简单形式,则可以使用multer在服务器上捕获文件,而不会出现问题。很简单。html只是一种形式,我在其中指定目标等,并且一切正常。nodejs代码也非常简单直接。

一旦我尝试使用angular,一切都会变得异常复杂。意思是,我必须使用指令,但服务器仍然有问题。正如我所说,我正在使用multer,它要求数据为“ multipart / form-data”,并且从服务器获取“错误:Multipart:未找到边界”

有很多模块可以按角度加载文件。这表明,不只一种解决方案是一个反复出现的问题。现在,我不想发布代码,因为为此我在Stack Overflow上提出了要求。我的问题更加微妙:

为什么用简单的形式可以完成什么呢?get的角度如此复杂?我并不是说这很糟糕。我的意思是“我想理解”。


这与您最近在Stack Overflow上提出的问题有关吗?“我如何解决错误‘边界没有发现’它有什么意思......”
蚊蚋

2
是的,这就是为什么我将链接放在问题上。但是在这里我不想解决问题。我首先想知道为什么会出现问题。
柯西2015年

Answers:


21

Angular用于单页应用程序,使用AJAX发送表格以避免重新加载页面。要使用AJAX发送多部分表格,您的浏览器需要支持FormData(IE10 +):http : //caniuse.com/#search=FormData

https://developer.mozilla.org/zh-CN/docs/Web/API/FormData

ngModel不适用于input [type =“ file”],因此您必须创建自己的指令。您自己的指令应该很简单:在更改时,更新File您范围内的对象。

发送表单时,请创建一个FormData对象,然后使用FormData.set或将文件添加到其中FormData.append。您可以使用$http或来发送FormData $resource,并且您依赖浏览器来设置内容类型和边界。

var formData = new FormData();
formData.append('file', $scope.file);
$http.post('yourUrl', formData, {
   transformRequest: angular.identity,
   headers: {'Content-Type': undefined}
}).then(function () {
   // ...
});

angular.identity 防止Angular对我们的数据做任何事情(例如序列化)。

我推荐这篇文章:https : //uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs


3
我想知道为什么file指令被遗漏了!
user237944 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.