ユーザーが自分のマシンから選択した画像とフォームデータをすべてJSONオブジェクトにラップしてサーバーに送信したい。私はNode for the serverを使用しています。画像を他のフォーム要素と一緒にJSONオブジェクトに配置してNodeで読み取ることはできますか?
私が遭遇した一般的な方法は、Base64文字列アプローチを使用することです。画像をBase64文字列にエンコードし、それをサーバーに送信するJSONオブジェクトの一部として設定します。
別のアプローチでは、JSONのバイナリデータを使用しているようですが、これまでにこれほど試したことはなく、あまり情報がありませんでした。
こちら JavascriptでBase64エンコーディングを行うコードサンプル。具体的には以下の方法を探します
function getBase64Image(imgElem) {
// imgElem must be on the same server otherwise a cross-Origin error will be thrown "SECURITY_ERR: DOM Exception 18"
var canvas = document.createElement("canvas");
canvas.width = imgElem.clientWidth;
canvas.height = imgElem.clientHeight;
var ctx = canvas.getContext("2d");
ctx.drawImage(imgElem, 0, 0);
var dataURL = canvas.toDataURL("image/png");
return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
}
これを実現する方法があります。画像データを使用します。
Javascriptでは、クライアント側でFileReaderを使用してバイナリイメージデータを読み取り、それらをbase64エンコードされた文字列に取得できます。
クライアント側:
var file = $('.file-upload > input')[0].files[0];
function upload(file) {
var reader = new FileReader();
// when image data was read
reader.onload = function(event) {
// I usually remove the prefix to only keep data, but it depends on your server
var data = event.target.result.replace("data:"+ file.type +";base64,", '');
// make here your ajax call
$.ajax({
url: 'and_so_on',
json: {
data: data
}
});
// read data from file
reader.readAsDataURL(file);
}
サーバー側では、バッファーコンストラクターを使用してバイナリに簡単に変換できるbase64エンコードされた画像を受け取ります
var buffer = new Buffer(data, 'base64');
FileReaderは すべてのブラウザーでサポートされているわけではありません であることに注意してください。