角度を使用してファイルを送信するのがなぜ難しいのですか?[閉まっている]


18

ファイル(非常に大きなファイル)をサーバーに送信する必要があります。私は自分が持っているオプションとその方法を勉強しています。角度+エクスプレス+ nodejsを使用しています。

単純なフォームを使用すると、multerを使用してサーバー上のファイルを問題なくキャッチできます。とても簡単です。htmlは単なるフォームで、ターゲットなどを指定するだけですべてが機能します。nodejsコードも非常に単純で単純です。

角度を使用しようとするとすぐに、すべてが非常に複雑になります。つまり、ディレクティブを使用する必要がありますが、それでもサーバーに問題があります。私が言ったように、データを「multipart / form-data」にする必要があるmulterを使用しており、サーバーから「Error:Multipart:Boundary not found」というメッセージを受け取ります。

Angularでファイルをロードするための多くのモジュールがあります。これは、それが複数の解決策で再発する問題であることを示しています。今、私はコードを投稿したくありません。なぜなら、そのためにStack Overflowで尋ねたからです。私の質問はもっと微妙です:

単純なフォームで何ができるのか、角度が非常に複雑になるのはなぜですか?悪い意味ではありません。「理解したい」という意味です。


これは、Stack Overflowでの最近の質問に何らかの形で関連していますか?「エラー「境界が見つかりません」の解決方法とその意味...」
gnat

2
はい、だからこそ私は質問にリンクを張った。しかし、ここでは問題を解決したくありません。そもそもなぜそれが問題なのか知りたい。
コーチ

回答:


21

Angularはシングルページアプリケーション用で、ページが再ロードされるのを防ぐために、フォームはAJAXを使用して送信されます。AJAXでマルチパートフォームを送信するには、ブラウザがFormData(IE10 +)をサポートする必要があります:http ://caniuse.com/#search=FormData

https://developer.mozilla.org/en-US/docs/Web/API/FormData

ngModelinput [type = "file"]では機能しないため、独自のディレクティブを作成する必要があります。独自のディレクティブは単純でなければなりません。変更時Fileには、スコープのオブジェクトを更新します。

フォームを送信するとき、FormDataオブジェクトを作成し、FormData.setまたはを使用してファイルを追加しますFormData.append$httpまたは$resourceでFormDataを送信できますが、コンテンツタイプと境界の設定はブラウザに依存しています。

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
ファイルディレクティブが角度で省略されているのはなぜでしょうか。
user237944
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.