JavaScript:ファイルをアップロード


190

ページにこの要素があるとしましょう:

<input id="image-file" type="file" />

これにより、WebページのユーザーがブラウザーのOSの[ファイルを開く...]ダイアログでファイルを選択できるボタンが作成されます。

ユーザーが上記のボタンをクリックして、ダイアログでファイルを選択し、「OK」ボタンをクリックしてダイアログを閉じたとします。

選択したファイル名は次の場所に保存されます。

document.getElementById("image-file").value

ここで、サーバーがURL "/ upload / image"でマルチパートPOSTを処理するとします。

「/ upload / image」にファイルを送信するにはどうすればよいですか?

また、ファイルのアップロードが完了したことを通知する方法を教えてください。


2
JavaScriptはサーバーサイドであるため、アップロードを処理していません。サーバー側のスクリプトはファイルを受け取り、それを移動します。一時フォルダーから目的のフォルダーへのphpの場合。
爆弾2011


15
問題はjQueryではなくPOJS(プレーンな古いJavaScript)に関するものであるため、再開することに投票しました。
e2-e4 2016

回答:


95

ajaxを使用してファイルをアップロードする場合を除き、フォームをに送信してください/upload/image

<form enctype="multipart/form-data" action="/upload/image" method="post">
    <input id="image-file" type="file" />
</form>

画像をバックグラウンドでアップロードしたい場合(フォーム全体を送信せずに)、ajaxを使用できます。


または、src = ""内に画像アップローダースクリプトを含むiframe 0x0サイズと、target = "iframeId"を使用してフォームを投稿し、jQueryなどを使用してバインドできるiframe src .loadイベントで結果を読み取ります。
ドミトリー

11
これは、参照、最近はJavascriptとAjaxを経由してupvoteすることが実際に可能です:stackoverflow.com/a/10811427/694469は (私はdownvoteしませんでした)。
KajMagnus 14

35
@KajMagnus、あなたはおそらく「アップロード」を意味していましたが、誤って「賛成」と言っていました
Samuel Allan

85

純粋なJS

オプションでawait-try-catchでフェッチを使用できます

let photo = document.getElementById("image-file").files[0];
let formData = new FormData();

formData.append("photo", photo);
fetch('/upload/image', {method: "POST", body: formData});

古い学校のアプローチ-XHR

let photo = document.getElementById("image-file").files[0];  // file from input
let req = new XMLHttpRequest();
let formData = new FormData();

formData.append("photo", photo);                                
req.open("POST", '/upload/image');
req.send(formData);

概要

  • サーバー側では、filenameformDataパラメータでブラウザが要求するために自動的に含まれる元のファイル名(およびその他の情報)を読み取ることができます。
  • 要求ヘッダーContent-Typeをに設定する必要はありませんmultipart/form-data-これはブラウザーによって自動的に設定されます。
  • 代わりに、の/upload/imageような完全なアドレスを使用できますhttp://.../upload/image
  • 単一のリクエストで多くのファイルを送信する場合は、multiple属性を使用し<input multiple type=... />、選択したすべてのファイルを同様の方法でformDataに添付します(例:photo2=...files[2];... formData.append("photo2", photo2);
  • たとえばlet user = {name:'john', age:34}、次のようにリクエストする追加のデータ(json)を含めることができます。formData.append("user", JSON.stringify(user));
  • このソリューションは、すべての主要なブラウザで機能するはずです。

私のために完璧に働きます。
Trieu Nguyen

formData === form submitenctype="multipart/form-data"
xgqfrms

エラーが発生しますnet::ERR_ABORTED 405 (Method Not Allowed)
Hidayt Rahman

@HidaytRahmanこのエラーは通常、サーバがURLのPOSTメソッドを実装していない場合に発生します
KamilKiełczewski

1
奇妙な-あなたの見出しに従って、私はもはやサーバーを必要としないと思っていました:D
Hidayt Rahman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.