前提・実現したいこと
jsでpngの画像をbase64エンコードしてjsonとしてPOSTし、pythonでそのエンコードされた文字列をデコードし、pngとして保存しようと思っております。
以下のようにコードを書いているのですが、保存時にファイルが壊れて開けません。
どうすればきちんと保存できるか教えていただきたいです。
該当のソースコード
javascript
1//エンコード 2btoa(encodeURIComponent(the_file.target.result))
python
1#デコードして保存 2with open(path, 'w', encoding='utf-8') as f: 3 f.write( 4 urllib.parse.unquote( 5 base64.b64decode( 6 validated_data['content'] #jsでエンコードされた文字列 7 ).decode() 8 ) 9 )
追記:全体のコード
javascript
1// cookie取得 2const get_cookie = name => { 3 let cookieValue = null; 4 if (document.cookie && document.cookie !== '') { 5 const cookies = document.cookie.split(';'); 6 for (var i = 0; i < cookies.length; i++) { 7 let cookie = jQuery.trim(cookies[i]); 8 if (cookie.substring(0, name.length+1) === (name+'=')) { 9 cookieValue = decodeURIComponent(cookie.substring(name.length+1)); 10 break; 11 } 12 } 13 } 14 return cookieValue; 15} 16 17class Transmission { 18 constructor(method, content, func) { 19 this.method = method; 20 this.content = content; 21 this.func = func; 22 this.__proto__.csrftoken = get_cookie('csrftoken'); 23 } 24 25 send(url) { 26 fetch(url, { 27 method: this.method, 28 credentials: "same-origin", 29 headers: { 30 "Accept": "application/json", 31 "Content-Type": "application/json", 32 "X-CSRFToken": this.csrftoken, 33 }, 34 body: JSON.stringify(this.content) 35 }) 36 .then(response => { 37 if(response.ok) { 38 return response.json(); 39 } else { 40 throw new Error("not found..."); 41 } 42 }) 43 .then(data => { 44 // thisの束縛 45 this.func(data); 46 }) 47 .catch(e => { 48 console.log(e.message); 49 }); 50 } 51} 52Transmission.uid = get_cookie('uid'); 53 54 55{ 56 let file_name = file_content = null; 57 // ファイル中身を展開しbase64エンコード 58 document.querySelector('.custom-file-input').addEventListener('change',function(e){ 59 const file = document.getElementById("input_file").files[0]; 60 const next_sibling = e.target.nextElementSibling; 61 file_name = file.name; 62 next_sibling.innerText = file_name; 63 if (1 <= document.getElementById("input_file").files.length) { 64 let reader = new FileReader(); 65 reader.onload = the_file => { 66 file_content = btoa(encodeURIComponent(the_file.target.result)); 67 } 68 reader.readAsText(file, "utf-8"); 69 } 70 }); 71 72 // document.getElementById("send").addEventListener("click", e => { 73 // const cmd = document.getElementById("cmd"); 74 // if(cmd.value != "") { 75 // let content = { 76 // sender: Transmission.uid, 77 // cmd: cmd.value, 78 // recipient: "00-FF-CE-89-86-5B" 79 // } 80 // if(file_name != null && file_content != null) { 81 // content["name"] = file_name; 82 // content["content"] = file_content; 83 // } 84 85 // tran = new Transmission( 86 // "POST", 87 // content, 88 // (data) => { 89 // console.log(data); 90 // } 91 // ); 92 // tran.send("http://127.0.0.1:8000/api/command/?format=json"); 93 // } 94 // }); 95 document.getElementById("send").addEventListener("click", e => { 96 const cmd = document.getElementById("cmd"); 97 if(cmd.value != "") { 98 let content = { 99 response: "hogheoh", 100 } 101 if(file_name != null && file_content != null) { 102 content["name"] = file_name; 103 content["content"] = file_content; 104 } 105 106 tran = new Transmission( 107 "PATCH", 108 content, 109 (data) => { 110 console.log(data); 111 } 112 ); 113 tran.send("http://127.0.0.1:8000/api/command/2/?format=json"); 114 } 115 }); 116 console.log(document.getElementById("target").value); 117} 118 119
補足情報(FW/ツールのバージョンなど)
python3
django rest framework
回答3件
あなたの回答
tips
プレビュー