Angular 4アプリからファイルコンテンツとしてBase64文字列を受け取るJSON APIサービスにファイルをアップロードしようとしています。Angular-upload file as base64
それでは、私がやっていることである - ユーザーがアップロードを確認したとき、私はAPIにJSONリクエストを作成し、私はそれ以前だファイルのbase64
文字列を送信します、FileReader.readAsDataURL
でファイルを読み込みます。
これは問題が始まるところである - とすぐに私は、「コンテンツ」と何かをして(W/E、それを送って、それをログ)要求は、例えば、送信が、そのめちゃくちゃスローされます2MBファイルの場合は20秒。
私が試してみました:
- を
ArrayBuffer
を使用して、手動でHTMLでbase64文字列を格納し、アップロードボタン - 上のユーザーがクリックした後、ファイルを読み込む
- 後でそれを取得するbase64で
- に変換します古いクライアントを使用する
@angular/common
- プレーンXHRリクエストを使用
しかし、すべてが同じ結果につながります。
私はどこに問題があるのか知っています。しかしなぜそれが起こるの?それは何かブラウザ特有のものか角に特有のものか?より好ましいアプローチがありますか(base64文字列でなければならないことに注意してください)?
注:APIで何も変更
- APIは大丈夫です、私のコントロールを超えて、任意のファイルトラフ郵便配達を送信すると、すぐに
コードを終了します。
この方法は、ユーザーがドロップゾーンにファイルを追加したときに実行されます。
public onFileChange(files: File[]) : void {
files.forEach((file: File, index: number) => {
const reader = new FileReader;
// UploadedFile is just a simple model that contains filename, size, type and later base64 content
this.uploadedFiles[index] = new UploadedFile(file);
//region reader.onprogress
reader.onprogress = (event: ProgressEvent) => {
if (event.lengthComputable) {
this.uploadedFiles[index].updateProgress(
Math.round((event.loaded * 100)/event.total)
);
}
};
//endregion
//region reader.onloadend
reader.onloadend = (event: ProgressEvent) => {
const target: FileReader = <FileReader>event.target;
const content = target.result.split(',')[1];
this.uploadedFiles[index].contentLoaded(content);
};
//endregion
reader.readAsDataURL(file);
});
}
このメソッドは、ユーザーのクリックがサーバーに大きなファイルを送信するためのボタン
public upload(uploadedFiles: UploadedFile[]) : Observable<null> {
const body: object = {
files: uploadedFiles.map((uploadedFile) => {
return {
filename: uploadedFile.name,
// SLOWDOWN HAPPENS HERE
content: uploadedFile.content
};
})
};
return this.http.post('file', body)
}
コードの問題について質問していますが、コードを1行だけ転記しているわけではありません。 –
@JB Nizet関連コードを追加しました – realshadow
httpを使用するのではなく、単純な文字列連結を使用してJSON文字列を自分で作成した場合(base64にはエンコードされていない文字が含まれていないことがわかっているので) –