以下の①~④ができるようにしたいです。
①ユーザーが画像ファイル選択
②localStrageに①のファイルを保存
③ページ再読み込み時に②で保存した画像ファイルを読み出し
④new DataTransferで input type="file" 要素を新たに作成する際に、③で読み出した画像ファイルをセット
⑤submitを行う
ユーザーが画像ファイルを選択して、そのファイルを、DataTransferで新たに作成した、input type="file"要素にセットするところまでは、確認できています。(localStrage不使用)
JavaScript
1let uploadImage = document.getElementsByName("uploadImage").item(0); 2let inputTemplate = document.createElement('input'); 3inputTemplate.setAttribute("name", "uploadImage"); 4inputTemplate.type = 'file'; 5 6uploadImage.addEventListener('change', e => { 7 const {files} = e.target; 8 const dt = new DataTransfer(); 9 dt.items.add(files[0]); 10 inputTemplate.files = dt.files; 11 dt.setData("Files", files[0]); 12 let file = dt.files; 13 let form = document.getElementById("form"); 14 form.appendChild(inputTemplate); 15}, false)
問題は、localStrageが絡んできた時です。
localStrageに画像を保存するために、Canvasでbase64にエンコードしています。
読み出し時に、base64のデコードを行いましたが、このデータを、どのようにして、new DataTransferで新たに作成する input type="file" 要素にセットすればいいのか不明です。
JavaScript
1let uploadImage = document.getElementsByName("uploadImage").item(0); 2 3uploadImage.addEventListener('change', e => { 4 var reader = new FileReader(); 5 reader.onload = function() { 6 var img = new Image(); 7 img.onload = function() { 8 var canvas = document.createElement('canvas'); 9 var context = canvas.getContext('2d'); 10 canvas.width=img.width; 11 canvas.height=img.height; 12 context.drawImage(img,0,0); 13 localStorage.setItem("hoge", canvas.toDataURL("image/jpeg")); 14 }; 15 img.src=reader.result; 16 }; 17 reader.readAsDataURL(uploadImage.files[0]); 18 19 var imgres = new Image(); 20 imgres.onload = function() { 21 var canvas = document.createElement('canvas'); 22 var context = canvas.getContext('2d'); 23 canvas.width=imgres.width; 24 canvas.height=imgres.height; 25 context.drawImage(imgres,0,0); 26 } 27 let imageData = localStorage.getItem("hoge"); 28 let decodeImage = imageData.split('data:image/jpeg;base64,')[1]; 29 let result = atob(decodeImage); 30 console.log(result); 31// base64のデコードが正常に完了している。これをどのようにしてDataTransferで作成するinput type="file"にセットすればいいか不明 32}, false)
やり方が違いますが、以下のリンク先でファイルの選択状態まで復元できている方がいるので、できないことはないのだと思います。
アップロードファイルを localStorage に保存して、再アクセス時にファイルを復元する
ただ、このページ記載の方法だと、不完全なコードなのかうまく動かない状態でして、困っています。
どなたか、DataTransferで作成するinput type="file"にセットする方法を、ご存じの方がいればご教授いただきたいです。
よろしくおねがいします。

回答2件
あなたの回答
tips
プレビュー