質問するログイン新規登録

回答編集履歴

2

ちょうせい

2021/12/20 13:00

投稿

yambejp
yambejp

スコア118098

answer CHANGED
@@ -26,6 +26,7 @@
26
26
  window.addEventListener('DOMContentLoaded', ()=>{
27
27
  const list=[];
28
28
  document.querySelector('.droparea').addEventListener('change',e=>{
29
+ list.length=0;
29
30
  var target=e.target;
30
31
  document.querySelector('#preview').textContent="";
31
32
  [...target.files].forEach((file,idx)=>{

1

chousei

2021/12/20 12:59

投稿

yambejp
yambejp

スコア118098

answer CHANGED
@@ -1,3 +1,75 @@
1
+ こんな感じで
2
+ ```javascript
3
+ <?PHP
4
+ print_r($_FILES);//自分自身に送ってファイルを確認する
5
+ ?>
6
+ <style>
7
+ .droppable{
8
+ border:1px solid;
9
+ position:relative;
10
+ height:300px;
11
+ }
12
+ .droparea{
13
+ position:absolute;
14
+ top:0;
15
+ width:100%;
16
+ height:100%;;
17
+ opacity:0;
18
+ background-Color:lime;
19
+ }
20
+ #preview img{
21
+ max-width:100px;
22
+ max-height:100px;
23
+ }
24
+ </style>
25
+ <script>
26
+ window.addEventListener('DOMContentLoaded', ()=>{
27
+ const list=[];
28
+ document.querySelector('.droparea').addEventListener('change',e=>{
29
+ var target=e.target;
30
+ document.querySelector('#preview').textContent="";
31
+ [...target.files].forEach((file,idx)=>{
32
+ if(file !==undefined){
33
+ var fr = new FileReader();
34
+ fr.addEventListener('load',e=>{
35
+ var type=file.type;
36
+ var name=file.name;
37
+ if(["image/jpeg","image/gif","image/png"].includes(type)){
38
+ var blob=new Blob([e.target.result],{type});
39
+ var binary=String.fromCharCode.apply("",new Uint8Array(e.target.result));
40
+ var base64="data:"+file.type+";base64,"+btoa(binary);
41
+ var img=Object.assign(document.createElement('img'),{src:base64});
42
+ list.push({blob,name});
43
+ img.addEventListener('click',()=>{
44
+ list[idx]=false;
45
+ console.log(list);
46
+ img.remove();
47
+ });
48
+ document.querySelector('#preview').appendChild(img);
49
+ }else{
50
+ target.value="";
51
+ }
52
+ });
53
+ fr.readAsArrayBuffer(file);
54
+ }
55
+ });
56
+ });
57
+ document.addEventListener('submit',(e)=>{
58
+ document.querySelector('[type=file]').disabled=true;
59
+ });
60
+ document.addEventListener('formdata',(e)=>{
61
+ list.forEach(x=>{
62
+ if(x) e.formData.append(document.querySelector('[type=file]').name,x.blob,x.name);
63
+ });
64
+ });
65
+ });
66
+ </script>
67
+ <form method="post" enctype="multipart/form-data">
68
+ <div class="droppable">
69
+ <div>ドロップして</div>
70
+ <input type="file" class="droparea" name="myfile[]" multiple>
71
+ </div>
72
+ <input type="submit">
1
- type=fileをmultipleしたときに得られるFileListはreadonlyなので
73
+ <div id="preview"></div>
2
- 要素を削除できません。
74
+ </form>
3
- CORSに自サイトへの送信でしたら非同期でfetchすればいけるかもしれません
75
+ ```