2

私は実際に、HTMLフォームを使用せずにjQueryを使用してサーバーに画像を送信したいと考えています。しかし、エンコード タイプの html フォームで受け取ったのと同じデータを取得したいと思います。

multipart/form-data

HTML5 FileReader を使用しました: http://www.html5rocks.com/en/tutorials/file/dndfiles/

しかし、関数を使用するときFileReader.readAsText(Blob|File, opt_encoding)。取得したデータは、html フォームでエンコードされているのと同じようにエンコードされていません。

「multipart/form-data」にはどのエンコーディングが使用されていますか?サーバーに送信する前に、jquery または javascript を使用してデータをエンコードすることは可能ですか?

//編集

w3schools から: http://www.w3schools.com/html5/att_form_enctype.asp

multipart/form-data ==> 文字はエンコードされません。この値は、ファイル アップロード コントロールを持つフォームを使用している場合に必要です。

私が抱えている問題は、FileReader からデータを取得するときに、HTML フォーム データと同じデータではないことです。

同じ画像の場合: html フォームを使用:

\xff\xd8\xff\xe1\x00\x18Exif\x00\x00II*\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xec\x00\x11Ducky\x00\x01\x00\x04\x00\x00\x00U\x00\x00\xff\xe1\x03)http://ns.adobe.com/xap/1.0/\x00<?xpacket begin="\xef\xbb\xbf" id="W5M0MpCehiHzreSzNTczkc9d"?>...

FileReader.readAsText() を使用:

\xc3\xbf\xc3\x98\xc3\xbf\xc3\xa1\\u0000\\u0018Exif\\u0000\\u0000II*\\u0000\\b\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\xc3\xbf\xc3\xac\\u0000\\u0011Ducky\\u0000\\u0001\\u0000\\u0004\\u0000\\u0000\\u0000U\\u0000\\u0000\xc3\xbf\xc3\xa1\\u0003)http://ns.adobe.com/xap/1.0/\\u0000<?xpacket begin=\\"\xc3\xaf\xc2\xbb\xc2\xbf\\" id=\\"W5M0MpCehiHzreSzNTczkc9d\\"?>

同じデータを取得する方法は?

4

2 に答える 2

1

FileReader.readAsBinaryString非テキスト ファイルのファイル コンテンツを取得するために使用する必要があります。

また、データを送信しようとするとエンコードされます。これを防ぐには、非標準で Gecko(firefox) でのみ利用可能なXMLHttpRequest.sendAsBinaryを使用できます。これは、使用するためのポリフィルですUint8Array

if (!XMLHttpRequest.prototype.sendAsBinary){
    XMLHttpRequest.prototype.sendAsBinary = function(datastr) {
        function byteValue(x) {
            return x.charCodeAt(0) & 0xff;
        }
        var ords = Array.prototype.map.call(datastr, byteValue);
        var ui8a = new Uint8Array(ords);
        this.send(ui8a.buffer);
    }
}

もちろん、File Api と Uint8Array をサポートするブラウザもサポートしているので、これはすべて簡単です。FormData

于 2012-09-06T22:41:53.840 に答える
0

わかりました。多くのソリューションをテストしているときに実際に答えを見つけましたが、見つけたものは少し奇妙でした。

実際、関数を使用して、Base64形式でデータをサーバーに送信しましたFileReader.readAsDataURL()

次に、split(',')サーバー側でBase64データのみを取得するデータを使用してデータをデコードしましたmy_base64_data_decoded = base64.b64decode(my_base64_data_encoded)

最初に、「boto」を使用してこれらのデータをAmazonに送信し、:cStringIO.StringIO(my_base64_data_decoded)を使用してデータをシリアル化しましたが、機能しませんでした。

辞書を作成しましたmy_dict

そして私はしましたmy_dict['data'] = base64.b64decode(my_base64_data_encoded)

そして:cStringIO.StringIO(my_dict['data'])そしてそれはうまくいった。

今私の質問は、辞書に挿入している間にデータに対してどのようなプロセスが行われたかということです。

しかし、少なくとも、私は答えを見つけました。

于 2012-09-07T13:02:40.637 に答える