
HTMLとJava Scriptのことを質問させてください
<form>タグからファイルを選択すると同時をアップロードしたいと思っています。
複数の「ファイルを選択ボタン」を設置し、それぞれ"001.jpg"、"002.jpg"など指定の名前でアップロードしたいです。
下記のようにいくつかの<form>タグを設置し、javascriptでコントロールできるかと思いケース1のように書いた場合はうまくいったのですが、ケース2のように複数並べて記述した場合、動かなくなり困っております。
どなたか教えていただけないでしょうか?
よろしくお願いいたします
ケース1)
<form id="upload_file1" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">
<input type="hidden" name="picture_id" value="001.jpg" />
<input type="file" id="file_id_1" name="file_name" accept="image/jpeg">
</form>
<form id="upload_file2" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">
<input type="hidden" name="picture_id" value="002.jpg" />
<input type="file" id="file_id_2" name="file_name" accept="image/jpeg">
</form>
<script>
var form = document.getElementById("upload_file1");
var input = form.file_name;
input.onchange = function (){
if(this.value){
form.submit();
}
};
</script>
ケース2)
<form id="upload_file1" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">
<input type="hidden" name="picture_id" value="001.jpg" />
<input type="file" id="file_id_1" name="file_name" accept="image/jpeg">
</form>
<form id="upload_file2" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">
<input type="hidden" name="picture_id" value="002.jpg" />
<input type="file" id="file_id_2" name="file_name" accept="image/jpeg">
</form>
<script>
var form = document.getElementById("upload_file1");
var input = form.file_name;
input.onchange = function (){
if(this.value){
form.submit();
}
};
var form = document.getElementById("upload_file2");
var input = form.file_name;
input.onchange = function (){
if(this.value){
form.submit();
}
};
</script>
No.4ベストアンサー
- 回答日時:
変数 form ですが、スクリプトの途中で上書きされています
var form = document.getElementById("upload_file1");
var form = document.getElementById("upload_file2");
イベント関数 onchange の内部にて変数 form を使っています
form.submit();
イベントが発生して関数が実行されると、この form の中身は
「イベント関数を宣言した時点の値」ではなく、
「イベント関数が実行された時点の値」と評価されます。
このため
フォーム upload_file1 でファイルを選択すると、
フォーム upload_file2 が submit されて送信。
という訳のわからない状態になっています。
修正するならば
* 変数名を form1,form2 と分ける
* onchange 内部で this.form.submit() とする
* フォーム毎に (function(){ ... })() で囲んで変数スコープを分ける
No.3
- 回答日時:
>No.1
セキュリティー上できないようになっているのなら、フォームが1つの時に成功する説明がつきませんよ。
変数名に注意してみてください。
質問文のそのままで、変数名をちょっと変えるだけで実現できます。
No.2
- 回答日時:
アップロードされるファイルの数には制限はありません。
その制限は、サーバーサイドのプログラムによる制限です。
プログラムを確認してください。
>選択ボタンと送信ボタンが別々だとユーザーの負担が大きいと思いました。
HTML5でしたら
<form action="#" method="post" enctype="multipart/form-data">
<p>複数ファイル:<input type="file" name="example" multiple><br>
Ctrlを押しながらファイルを選択してください。</p>
で良いです。
後方互換が必要な場合は、
<p><input type="file1" name="example1"></p>
<p><input type="file1" name="example2"></p>
<p><input type="file1" name="example3"></p>
と複数作って、最後に送信ボタン
>ファイルを選択し、最後に送信ボタンをひとつつけて送信することも考えたのですが、それでは部分的にしかアップロードされず、
これはサーバー側のプログラムを修正してください。
どうもありがとうございます。
プログラム作成にとても大切な心構えを教えていただきました。
なかなか心くばりが行き届かず、反省しています。
No.1
- 回答日時:
しばしば、してしまう選択ミスへの対処は??
例えば、「あなたの写真を選択してください。」と書いておいて、エクスプローラーから選択したトタンに送信させるという悪意をもって設置されたら???
そのようなことに対する最後の安全対策で基本的にはできないようになっていますが、それを押しのけてまで、そういう実装をしたい意図を知りたい。
プログラム作成するときは、フェールセーフ・フールセーフも常に考えないとまずい。
この回答への補足
ご返事どうもありがとうございます。
安全対策のためにできないように設計されていたのですね。
それは知りませんでした。気が回らず失礼いたしました。
基本的にはユーザーの手間を簡略化するための仕様です。
構図があらかじめ決まった写真のアップロードが必要なサイトを構築したいと思っています。50枚以上の写真を選択する必要があるため、選択ボタンと送信ボタンが別々だとユーザーの負担が大きいと思いました。
ファイルを選択し、最後に送信ボタンをひとつつけて送信することも考えたのですが、それでは部分的にしかアップロードされず、ひとつの写真にひとつのボタンを設置することを考えた次第です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別窓ウィンドウから親ウィンド...
-
別ウィンドウへのsubmitの挙動...
-
submitした値を返したい
-
特定<table>内の<td>の色を変える
-
return trueとreturn falseの用...
-
子から親へチェックボックスの...
-
【UWSC】HTML内のある部分を抽...
-
JavaScriptでテーブルをクリッ...
-
onchangeイベントを強制的に発...
-
ラジオボタンによるフォームの...
-
ASP.NETでNAME属性を固定にしたい
-
<input>の選択肢をプルダウンメ...
-
JavaScriptで特定のtdタグにcla...
-
radio選択をクッキーに保存させ...
-
どちらかひとつのテキストボッ...
-
イントラマート
-
onClickとsubmitの処理順序
-
confirmのOK・キャンセルを押し...
-
セルをドラッグで選択するときに、
-
HTMLのテキストボックスへのド...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
submitした値を返したい
-
1つのform内に2つのsubmitボタ...
-
別ウィンドウへのsubmitの挙動...
-
javascriptでASPにデータを渡す
-
指定したタグを書き換えるには?
-
FormのonsubmitでJavaスクリプ...
-
iframe内のformをサブミットす...
-
1つのページにformを2つ設置。2...
-
JavaScript:現在フォーカスの...
-
POST時に要素を削除してからPOST
-
JavascriptからSubmitして画面...
-
フォームのvalueに配列を格納す...
-
タブキーでなくエンターキーで...
-
リンク先アドレスの一部にテキ...
-
JAVASCRIPT
-
Javascript IEで「識別子があり...
-
focus()が上手くいかない
-
submitボタン押下後、disabled...
-
formのsubmitイベントの発生に...
-
inputのvalueを変数として使うには
おすすめ情報