質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

556閲覧

複数ファイルアップロードのjqueryで、ファイルのlastModifiedがすべて同じになるのを解消したい

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2018/01/31 00:57

編集2018/01/31 01:29

##わからないこと
いつもお世話になっております。
この度ファイルを複数アップロードさせる際に、jqueryでforをループさせています。
その中でそれぞファイルのlastModifiedを取得しようとしているのですが、すべて同じ値になってしまいます。
その原因はどこにあるのでしょうか?

ご教授いただければ幸いです。

javascript

1$('#uploadName').on('change', function(event){ 2 var $input = $(this); 3 var files = event.target.files; 4 $li = $input.closest('.each_file'); 5 for (var i = 0, f; f = files[i]; i++) { 6 // 一件ずつアップロード 7 imageFileUpload(f); 8 var imgUrl = '{!!url("/img/car/cv/' + id + '/' + fileName + '")!!}'; 9 var reader = new FileReader; 10 reader.readAsDataURL(f); 11 reader.onloadend = function(){ 12 var fileReader = this; 13 if(fileReader.result){ 14 var thumb = '<div style="margin: 15px 10px 0 10px;width:145px;float: left;" class="thumbnail box"><a href="' + fileReader.result + '"><img src="' + fileReader.result + '" width="145px" height="150px" style="max-width: 145px; max-height: 150px;height: -webkit-fill-available;margin-top:5px;" alt="'+ i +'"><input type="hidden" name="id" value="{{request()->input('id')}}"><input type="hidden" name="filename" value="' + imgUrl + '"><input type="hidden" name="filetime" value="' + filetime + '"><span style="width: 70px; height: 19px; text-align: center; margin-top: 5px;margin: 0 auto;float: left;" class="del-button ui-opaimg">確認</span></a><span style="width: 70px; height: 19px; text-align: center; margin-top: 5px;margin: 0 auto;float: right;" class="delete_btn del-button ui-opaimg">削除</span></div>'; 15 $li.append(thumb); 16 } 17 }; 18 } 19}); 20// ファイルアップロード 21function imageFileUpload(f) { 22 // entrant_id取得 23 var id = $("#id").val(); 24 var fd = new FormData(); 25 fd.append('img_file', f); 26 fd.append('id', id); 27 fileName = f.name; 28 filetime = f.lastModified; 29 // ファイルアップロード時刻を取得 30 fd.append("img_file[]", filetime); 31 fd.append("book", 'cv'); 32 $.ajax({ 33 url: "{{action('PorController@fileUpload')}}", 34 type: 'POST', 35 dataType: 'html', 36 data: fd, 37 processData: false, 38 contentType: false, 39 timeout: 10000, 40 }) 41 // 失敗時 42 .fail(function(jqXHR, statusText, errorThrown){ 43 console.log(jqXHR); 44 alert('タイムアウトしました'); 45 }) 46 // 成功時 47 .done(function(data, textStatus, jqXHR){ 48 console.log(textStatus); 49 if(textStatus == 'success') { 50 alert('succccccceeeeeeessssss!!'); 51 return true; 52 } else { 53 alert(data); 54 return false; 55 } 56 }); 57} 58

html

1<label style="text-align: center; width: 150px; margin: 0 auto; padding: 10px;" class="bt-photo02 ui-bt-nomal ui-opaimg">経歴書を添付する 2 <input type="file" id="uploadName" class="input_file" name="img_file[]" value="経歴書をアップロード" style="display:none;" multiple> 3 <input type="hidden" id="id"name="id" value="{{request()->input('id')}}"> 4 </label>

※コードが不足していましたら追加いたします。

何卒よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

この問題は関数imageFileUpload内で利用している変数filetimeグローバル変数(もしくは上位スコープで定義されたもの)である点と, サムネイルの生成処理がFileReaderオブジェクトにより非同期で行われていることで発生しています.

  1. まず, $('#uploadName').on('change',でのforループ内でimageFileUploadメソッドとファイルの内容をFileReaderオブジェクトで読み込む処理を行っていますが, onloadendに登録したリスナ関数(サムネイル生成)はその実行をスケジュールしているだけで, この時点では実行されていません.
  2. imageFileUploadにおいてはグローバル変数filetimeにファイルの最終更新日時を代入します. これをforループで繰り返しているため, 結果最後のファイルの最終更新日時が格納されることになります.
  3. その後ファイルの読み込みが完了すると, 一斉にサムネイルの生成処理が実行されます. すると, 先ほどのfiletime変数の内容をHTMLに追加していくので, 全て同じ日時が出力されることになります(ファイル名についても同様).

対処策としては, forループ内でスコープを分離し, Fileオブジェクトを識別できるようにする方法でしょうか.

$('#uploadName').on('change', function(event){ var $input = $(this); var files = event.target.files; $li = $input.closest('.each_file'); for (var i = 0, f; f = files[i]; i++) { // 一件ずつアップロード (function(f){//スコープを分離→変数fileName/filetimeをFileオブジェクトごとに用意する imageFileUpload(f); //ファイル名・最終更新日時はここで取得する var fileName = f.name; var filetime = f.lastModified; var imgUrl = '{!!url("/img/car/cv/' + id + '/' + fileName + '")!!}'; var reader = new FileReader; reader.readAsDataURL(f); reader.onloadend = function(){ var fileReader = this; if(fileReader.result){ var thumb = '<div style="margin: 15px 10px 0 10px;width:145px;float: left;" class="thumbnail box"><a href="' + fileReader.result + '"><img src="' + fileReader.result + '" width="145px" height="150px" style="max-width: 145px; max-height: 150px;height: -webkit-fill-available;margin-top:5px;" alt="'+ i +'"><input type="hidden" name="id" value="{{request()->input('id')}}"><input type="hidden" name="filename" value="' + imgUrl + '"><input type="hidden" name="filetime" value="' + filetime + '"><span style="width: 70px; height: 19px; text-align: center; margin-top: 5px;margin: 0 auto;float: left;" class="del-button ui-opaimg">確認</span></a><span style="width: 70px; height: 19px; text-align: center; margin-top: 5px;margin: 0 auto;float: right;" class="delete_btn del-button ui-opaimg">削除</span></div>'; $li.append(thumb); } }; })(f); } });

NOTE:
つまるところ, ループ処理におけるイベントハンドラの取扱いにおいて頻出する問題であるため, 関連する文献は相応に見つかると思います.

投稿2018/01/31 02:21

編集2018/01/31 02:31
defghi1977

総合スコア4756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/31 02:28

ご回答ありがとうございます。 ご指摘頂いた通り、forループ内の処理をfunctionで囲んでみましたが、それでもfiletimeはすべて同じ値になってしまっていました。
defghi1977

2018/01/31 02:30

途中 var fileName = f.name; var filetime = f.lastModified; の2行を追加しています.
退会済みユーザー

退会済みユーザー

2018/01/31 02:33

ご指摘ありがとうございます! 無事望んだ値を取得することができました。 イベントハンドラ含めjqueryに不慣れなので、NOTEにてアドバイスをしてくださった点から勉強していきたいと思います。 ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問