【Visualforce】inputTextを使用してアップロードした画像ファイルがおかしい
Vislaoforceでファイルをアップロードする動作を含む画面を作成していました。
画面の描画はrerenderを用いているため、inputFileは使用することが出来ません。
そんなわけで、過去にここで記事にした方法で実装を行っていました。
しかし、この機能でファイルがうまくアップロードされないという不具合が発生しました。
問題が発生したのはiPhoneで、アップロードした画像が途中でグレーになってしまうようです。
何度やっても同じことが起きるとのことで、急いで調査することになりました。
テストのときにiPhoneでも確認したはずなのですが、その時は正常に動いていました。
しかし、カメラから写真を撮ってそのままアップロードするという動きは確認していませんでした。
実際にカメラで撮った画像で試してみると、同じ現象が発生しました。
Chromeで同じ画像を使って確認しても、再現しませんでした。
ファイルのアップロードについて細かく調べていくと、アップロードしたファイルとSalesforce側のファイルのサイズが大きく異なることが分かりました。
さらに調べていくと、inputタグにファイルの中身をセットした際に、長さが変わっていることが分かりました。
どうやらこれが原因のようです。
inputタグにセットした後の文字列の長さは524288文字でした。
ぐぐってみると、512KBなのですね。
https://stackoverflow.com/questions/26469152/why-is-the-default-max-length-for-an-input-524288
どうやら、input type=”text”の文字数の上限は524288文字だったようです。
ブラウザごとの最大文字数は確認していませんが、これが原因であることは間違いありません。
inputTextをtextareaに直すことで解決することが出来ました。
こんな感じでしょうか。
<input type="file" onchange="setAttachment(this);" /> <apex:inputHidden id="fileName" value="{!fileAttachment.Name}" /> <apex:inputTextarea id="fileBody" value="{!fileAttachment.Body}" style="display: none;" /> <apex:commandButton action="{!uploadAttachment}" value="アップロード" /> <script> function setAttachment(obj){ var reader = new FileReader(); var file= obj.files[0]; var fileName; var fileBody; // ファイルが設定されていない場合は何もしない if(typeof file === "undefined"){ return; } // ファイル読み込み時の処理を設定する reader.onload = function(event){ // ファイル名を取得する fileName = file.name; // ファイルの中身を取得する fileBody = event.target.result; // hidden項目にNameを設定する $(obj).siblings('input[id$="fileName"]').val(fileName); // hidden項目にBodyを設定する $(obj).siblings('input[id$="fileBody"]').val(fileBody); } // ファイルの読み込みを行う reader.readAsDataURL(file); } </script>
このロジックを使った方がいるか分かりませんが、もし居たら申し訳ありませんでした。
No comments.