【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.