input[type="file"]
の値の変更はセキュリティ上の問題とかでnull
にする以外は認められていなかったかと思います。
つまり1つのinput[type="file"]
で複数画像を選択させる場合、ファイル選択無しにする以外はjsで操作することができません。特定の1つを削除ができない訳です。
ですので、
- 複数選択ではなく、1inputタグ1ファイルとし、画像選択時に新しい
input[type="file"]
を作成し、画像削除時に該当するinput[type="file"]
を削除させるのが良いかと思います。
あるいは、
2. 複数選択のままにしておき、アップロードするファイルのIDなどをリストに保持させて、画像削除時にリストから削除しフォームデータ送信時にそのリストを元に対象外のファイルを弾いてajaxで送信するとかでしょうか。
1. 新しいinputタグを追加するパターン
html
1<form action="upload" method="post" enctype="multipart/form-data">
2 <ul id="file_list">
3 <li class="js-file">
4 <input class="js-inputFile" type="file" name="upfile[]" size="30" accept="image/jpeg" />
5 </li>
6 </ul>
7 <input id="submitBtn" type="submit" value="アップロード" />
8</form>
javascript
1$(function() {
2 var init = function() {
3 // idはhtmlに1つなので $(#id名) とした方が高速
4 var $fileList = $('#file_list');
5
6 $fileList
7 // ファイル削除イベント
8 .on('click.deleteFile', '.js-deleteBtn', function(evt) {
9 var $li = $(this).closest('.js-file');
10 // input[type="file"]が1つ以上の場合は該当のinpuタグを削除する
11 if($fileList.find('.js-file').length > 1) {
12 $li.remove();
13 } else {
14 $li.find('.js-thumb').remove();
15 }
16 return false;
17 })
18 // ファイル選択時のイベント
19 .on('change.inputFile', '.js-inputFile', function(evt) {
20 var $input = $(this),
21 fileID = $input.data('fid'),
22 $li = $input.closest('.js-file'),
23 $newLi;
24
25 if(evt.target.files.length) {
26 $newLi = $li.clone();
27 $newLi.find('.js-inputFile').val(null);
28 // 新しくinputタグを追加する
29 $fileList.append($newLi);
30
31 $.each(evt.target.files, function(i, elm) {
32 var file = this,
33 fileName = file.name,
34 reader;
35
36 // サムネイル画像生成
37 reader = new FileReader();
38 reader.readAsDataURL(file);
39
40 // サムネイルを表示させる処理
41 reader.onloadend = function(evt) {
42 var fileReader = this;
43 if(fileReader.result) {
44 var thumb = '<div class="js-thumb"><img src="' + fileReader.result + '" width="150px" height="150px" style="max-width:100%;height:auto;">' + fileName + '<button class="js-deleteBtn">削除</button></div>';
45 $li.append(thumb);
46 }
47 return this;
48 };
49 });
50 $input.hide();
51 } else {
52 // ファイルが選択がキャンセルされた時 既にサムネイルが表示されてるなら削除する
53 $li.find('.js-deleteBtn').trigger('click');
54 }
55 return this;
56 });
57 };
58 init();
59});
2. フォームデータ送信時に対象外のファイルを弾くパターン
html
1<form id="myForm" action="upload" method="post" enctype="multipart/form-data">
2 <input id="js-inputFile" type="file" name="upfile[]" size="30" multiple accept="image/jpeg" />
3 <input id="submitBtn" type="button" value="アップロード" />
4</form>
5<ul id="file_list"></ul>
javascript
1$(function() {
2var init = function() {
3 var $form = $('#myForm'),
4 $fileList = $('#file_list'),
5 filesObj;
6
7 // サムネイル削除時
8 $fileList.on('click.deleteFile', '.js-deleteBtn', function(evt) {
9 var $li = $(this).closest('.js-thumb'),
10 fileID = $li.data('img-id');
11 $li.remove();
12 // ファイルリストから削除
13 delete filesObj[fileID];
14 return false;
15 });
16
17 $form
18 // ファイル選択時
19 .on('change.selectFiles', '#js-inputFile', function(evt) {
20 // ファイルリスト・ファイルリストを初期化
21 $fileList.html('');
22 filesObj = {};
23 jQuery.each(evt.target.files, function(i, elm) {
24 var file = this,
25 fileName = file.name,
26 fileIndex = i,
27 reader;
28 // ファイルリストに追加
29 filesObj[i] = file.name;
30
31 // サムネイル画像生成
32 reader = new FileReader();
33 reader.readAsDataURL(file);
34
35 // サムネイルを表示させる処理
36 reader.onloadend = function(evt) {
37 var fileReader = this;
38 if(fileReader.result) {
39 var html = '<li class="js-thumb" data-img-id="' + fileIndex + '"><img src="' + fileReader.result + '" width="150px" height="150px" style="max-width:100%; height: auto;">' + fileName + '<button class="js-deleteBtn">削除</button></li>';
40 $fileList.append(html);
41 }
42 return this;
43 };
44 return this;
45 });
46 })
47 // フォーム送信時の処理
48 .on('click.formSubmit', '#submitBtn', function(evt) {
49 var formData = new FormData(),
50 files = $('#js-inputFile').prop("files");
51
52 for(var i=0, l=files.length; i<l; i+=1) {
53 // 削除されていないファイルだけを送信するように整形
54 if( filesObj[i] ) {
55 formData.append("upfile[]", files[i]);
56 }
57 }
58 // その他のデータもある場合は formData に追加する
59
60 $.ajax({
61 url: 'API_URL フォーム送信先のURL ',
62 method: 'post',
63 dataType: 'json',
64 data: formData,
65 processData: false,
66 contentType: false,
67 })
68 .done(function( res ) {
69 console.log('送信成功', res);
70 })
71 .fail(function(jqXHR, textStatus, errorThrown) {
72 console.log('送信失敗', jqXHR, textStatus, errorThrown);
73 });
74 return false;
75 });
76 };
77 init();
78});
手前味噌で恐縮ですが、ファイルをAjaxで送信するのはコチラを参照下さい。
jQuery Ajaxでファイルを送りたい! - かもメモ
※ ちょっと古い記事なので今ならもっとモダンな方法があるかもしれませんが...
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。