7

つまり、イメージのバイナリ データをハンドラーに送信し、DB にバイト配列として保存したいと考えています。Javascriptを使用してファイル入力の値を読み取ると、次のreadAsBinaryString(f)ような出力が得られます。

GIF89a,úæÿÿÿ2c½3fÌ Smaäµééúþc«T.[ÈéùAtεÚõ[ãXßÆî*[µc³8Ûõüÿfj¥æ§ÈïÛå÷ËØñI}ÓQ×
*\»q£E}Ûÿå§ÓõþÿIÛv¤Þ´Åè«æ ³][us¬çAy×MÞ,a½«ÔóZÝL2äëùQ×(Eq<pË5V¨·ÏIÓ¨»åQßY¥3bØÈ
æ¬z³é<uÓ3£ÎñE¾á÷RÛR¢K­®ÎØØìÍAtÓÑÔØrÀ-hݪÑïôõüR|ÎäóÖUËåæçXÔw»^s®ëI}ÛQ}ÔEÛ·Îñ½Óêd»Ì
ÌëöåóôöÖàñE×Cr¿C¤3óúëLÍYÜ3fõûöÑðû Øûÿõw²ñ`ª»ßÀy|Á¿ÃIuÔM×ûñû{¹R4¼ìe¡äl«ç!ÿNETSCA
PE2.0!ÿXMP DataXMP<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpm
eta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02
/06-14:56:27   // etc..  

そのデータは AJAX 経由で送信されます。

$.ajax({
    url: theUrl,
    type: 'POST',
    data: { Image: image } // image = data above
});

これはバイナリ文字列ですか?この文字列をハンドラー (IHttpHandler) に送信すると、バイト配列に格納するために、エンコーディングを ISO-8859-1 に設定した場合にのみバイトを取得できます。

public void ProcessRequest (HttpContext aContext) 
{ 
    // This works as long as requestValidationMode = "2.0" in web.config
    // Is there a way to bypass HttpRequestValidationException  just on 
    // THIS data?
    byte[] imageBytes = System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(_Context.Request["Image"]);

    //...
}

これは正常ですか?これにより、HttpRequestValidationException もスローされます (潜在的に危険な Request.Form 値が..から検出されました)。requestValidationModeXSS に対応しているので変更したくないので、バイナリ文字列をどのようにエスケープしますか? Base64エンコーディングはこれをカバーしていますか?もしそうなら、ハンドラーでのBase64からの変換には、そのデータ型に関するメタデータが含まれていますか?

4

1 に答える 1

9

コードで何をしているかを確認することは本当に役に立ちます。あなたのコードは次のようになると思います:

var f = $("image").files[0];
var reader = new FileReader();
reader.readAsBinaryString(f);
var image = reader.result;

$.ajax({
    url: theUrl,
    type: 'POST',
    data: { Image: image }
});

今あなたが言うとき:

次のような出力が得られます。

GIF89a,úæÿÿÿ2c½3...

出力 [...] はバイナリ データですか?

はい、でも読めますので、テキストです。バイナリ データとテキスト データの違いは少し紛らわしいので、さらに混乱したい場合はこれを読んでください。その記事で説明されているように、問題の原因はエンコードです。

ページに出力する方法によって異なりますが、ブラウザーは受信したデータに特定のエンコーディングを適用する場合と適用しない場合があります ( Fiddlerインスペクションでは、HTTP ワイヤーを介して送信されているものについて詳しく知ることができます)。読みにくいテキスト。

ただし、これは変数には適用されません。この変数には、結果imageからの実際のバイナリ データが"raw binary data[sic]"の形式で含まれます。ああ、緩く型付けされた、あなたが何を返すかを誰が気にしますか。バイト配列を推測/希望します。これをサーバーに送信する必要があります。ファイルのアップロードは要素で処理するのが望ましいですが、AJAX を使用して処理する必要がある場合もあります。私の知る限り、ブラウザのサポートは増えているようですが、実際には JavaScript を介して実際のファイルをアップロードすることはできません。readAsBinaryString()<input type="file" />

POSTそのため、投稿されたフォームのパラメーターの 1 つとしてファイルの内容を使用する必要があります。これをバイナリ データで正常に行うには、フォーム送信用に適切にエンコードする必要があります。

まず、リクエストがcontent-typeof で作成されていることを確認してapplication/x-www-form-urlencodedください。これは、Fiddler で確認するか、マニュアルを参照して確認できます。後者はエンコーディングについてまったく言及していないため、それを理解する必要があります。

次に、投稿するためにバイナリ データをURL エンコードする必要があります。この関数は、UTF-8 として解釈された入力バイトを、安全に投稿できる URL エンコードされた文字列として返します。次に、サーバー側で、置き換えることができます

System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(_Context.Request["Image"]);

System.Text.Encoding.UTF8 .GetBytes(_Context.Request["画像"]);

しかし、とにかくファイルの内容をその形式で持っているのはなぜですか? この回答が言及しているように、変数として直接使用できるメソッドFileReaderも含まれています。readAsDataURLreader.resultPOST

したがって、コードは次のようになります。

var f = $("image").files[0];
var reader = new FileReader();
reader.readAsDataURL(f);
var image = reader.result;

$.ajax({
    url: theUrl,
    type: 'POST',
    data: { Image: image }
});

次に、サーバー側で、base 64 からデータをデコードする必要があります。

byte[] imageBytes = System.Convert.FromBase64String(_Context.Request["Image"]);

それはどのように機能しますか?

于 2013-05-17T23:59:02.583 に答える