[解決済み】データURIをファイルに変換してFormDataに追記する。
2022-04-18 21:51:29
質問
HTML5の画像アップローダーを再実装しようとしています。
Mozilla Hacksに掲載されている
というサイトがありますが、これは WebKit ブラウザで動作するものです。このタスクの一部は、画像ファイルを
canvas
オブジェクトに追加し、それを
フォームデータ
オブジェクトをアップロードします。
問題は
canvas
には
toDataURL
関数を使って画像ファイルの表現を返しますが、FormData オブジェクトは、File オブジェクトまたは Blob オブジェクトを
ファイルAPI
.
Mozilla のソリューションでは、以下の Firefox 専用の関数を
canvas
:
var file = canvas.mozGetAsFile("foo.png");
...これは WebKit ブラウザでは利用できません。私が思いついた最善の解決策は、Data URI を File オブジェクトに変換する方法を見つけることです。これは File API の一部ではないかと思ったのですが、それを行う方法がどうしても見つかりませんでした。
可能ですか?できない場合、何か代替案はありますか?
ありがとうございます。
解決方法は?
いろいろと遊んでいるうちに、なんとか自分で解決することができました。
まず、これはdataURIをBlobに変換するものです。
function dataURItoBlob(dataURI) {
// convert base64/URLEncoded data component to raw binary data held in a string
var byteString;
if (dataURI.split(',')[0].indexOf('base64') >= 0)
byteString = atob(dataURI.split(',')[1]);
else
byteString = unescape(dataURI.split(',')[1]);
// separate out the mime component
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
// write the bytes of the string to a typed array
var ia = new Uint8Array(byteString.length);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ia], {type:mimeString});
}
ここから、データをファイルとしてアップロードするようなフォームに追記するのは簡単です。
var dataURL = canvas.toDataURL('image/jpeg', 0.5);
var blob = dataURItoBlob(dataURL);
var fd = new FormData(document.forms[0]);
fd.append("canvasImage", blob);
関連
-
[解決済み】node.js TypeError: path must be absolute or specify root to res.sendFile [JSONのパースに失敗しました]。
-
[解決済み】JavaScriptのinnerHTMLで要素が更新されない
-
[解決済み】最大呼び出しスタックサイズ超過エラーとその修正方法とは?
-
[解決済み】Javascriptのコールバック関数がFirefoxで「Callback is not a function」というエラーを投げる
-
[解決済み】Google Conversionsが動作しない - スクリプトが読み込まれない
-
[解決済み】「Uncaught TypeError: Chromeで "Illegal invocation "が発生する。
-
[解決済み】リソースはドキュメントと解釈されるが、MIMEタイプはapplication/zipで転送される
-
[解決済み] jQueryでフォームデータをJavaScriptオブジェクトに変換する
-
[解決済み] Nodeでファイルに追記する方法は?
-
[解決済み] <canvas> を拡大縮小する際に補間を無効にする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Heroku:ノードアプリで「このアプリにはデフォルトの言語が検出されませんでした」エラーがスローされる
-
[解決済み】フォームコントロールの値アクセサがない
-
[解決済み】SecurityError: オリジンを持つフレームがクロスオリジンフレームにアクセスするのをブロックした
-
[解決済み】XMLHttpRequestモジュールが定義されていない/見つからない
-
[解決済み】コンソールがUnterminated JSX contentsエラーを投げる【終了しました
-
[解決済み] [Solved] Uncaught TypeError: nullのプロパティ 'appendChild' を読み取ることができない。
-
[解決済み】Javascript - ERR_CONTENT_LENGTH_MISMATCH
-
[解決済み】JavaScript ランタイムエラー:'$'が未定義です。
-
[解決済み】Kendo Observable Bindingと併用する場合、Kendo Switch Labelsを変更することは可能ですか?[Kendo-UI]です。
-
[解決済み】HTMLの最初の行に予期しないトークン<がある。