3

今日、私はSQLバイナリオブジェクトを実験してきました。まず、画像をテーブルに保存し、画像のbase64エンコーディングをAJAXリクエストして、で表示することから始めました。

<img src="data:image/jpeg;base64,' + base64imageReturnedWithAjax + '">')

画像はきれいに表示されます。

私が取り組んでいるWebプロジェクトには、ファイルのダウンロードも必要です(主にPDF)-すばらしいと思います。PDFもSQLバイナリオブジェクトとして保存し、同じ方法でサーバーから収集してから、なんとかして魔法のようにデコードします。もう一方の端でダウンロードするためにそれ。

ヘルプ!

私は最初にjQuerybase64デコーダー(https://github.com/carlo/jquery-base64)を使用してそれをデコードしようとしました:

$.base64.decode(base64fileReturnedWithAjax)

これにより、コンソールで次のエラーが生成されます。

Uncaught Cannot decode base64
_getbyte64
_decode
$.ajax.success
f.Callbacks.o
f.Callbacks.p.fireWith
w
f.support.ajax.f.ajaxTransport.send.d

したがって、私の質問は次のとおりです。これはファイルのダウンロードを処理するための実行可能な方法ですか?もしそうなら、どのように!そうでない場合は、SQLテーブルからファイルをダウンロードできるようにするためのアドバイスされた方法はありますか?

よろしくお願いいたします。ATfPT


編集:それが役立つ場合、これはデータベース(VB.NET内)からファイルを取得して送信するWebメソッドです。Fileblobは、データベース内のバイナリオブジェクトです。

    'Having connected to the table
    While lrd.Read()
        Dim fileBytes = CType(lrd("Fileblob"), Byte())
        Dim stream = New MemoryStream(fileBytes, 0, fileBytes.Length)
        Dim base64String = Convert.ToBase64String(stream.ToArray())
        document.Add(base64String)
    End While

    Dim serializer As New JavaScriptSerializer()
    Dim returnVal As String = serializer.Serialize(document)

    Return returnVal
4

2 に答える 2

4

インラインbase64は(小さい限り)画像でうまく機能するので、おそらく正しい方向に進んでいます。varbinary(max)ただし、PDFや他のほとんどのBLOB( SQL Server内)の正しい道を進んでいるとは思いません。

これを行う方法は、正しいHTTPヘッダーを設定し、SQLServerから取得したデータをResponse.BinaryWrite()バイト配列として渡すHTTPハンドラー(コントローラー、ASHX、ASPXなど)を作成することです。これは高速で、クリーンで、信頼性があります。また、必要なコードはごくわずかです。

比較すると、base 64エンコーディングはファイルサイズを大きくし、base 64文字列をクライアント側で処理し、正しいアプリケーションで開くようにブラウザに指示する信頼できる方法を私は知りません。さらに、エンコード/デコードは完全に不要なオーバーヘッドです(これは大きなファイルでは重要になる可能性があります)。

ちなみに、画像にHTTPハンドラーを使用することもできます。または、引き続きbase 64を使用して、すべての画像を単一のJSONオブジェクトで提供することで、リクエスト数を減らすことができます(クライアント処理コードが増えます)。

HTTPハンドラーの例

いくつかのプロダクションコードをPDFを処理する部分だけに分解しました。これは最小限の変更で機能するはずです。

VisualStudioのプロジェクトに汎用ハンドラーを追加することから始めます。ASHX拡張子が付きます。

public partial class RequestHandler : IHttpHandler
{
    public void ProcessRequest( HttpContext context ) {
        HttpRequest request = context.Request;
        HttpResponse response = context.Response;

        byte[] bytes = null; // get from your database
        string fileName = null; // get from database or put something generic here like "file.pdf"

        response.ContentType = "application/pdf";
        response.AddHeader( "content-disposition", "inline;filename=" + fileName );
        response.AddHeader( "Content-Length", bytes.Length.ToString() );

        response.Buffer = true;
        response.BinaryWrite( bytes );
        response.Flush();
    }

    public bool IsReusable {
        get {
            return true;
        }
    }
}

このコードを呼び出すには、たとえばにリンクするだけです<a href="RequestHandler.ashx?id=abc">Download</a>。このコードをASPXページ内に配置し、ボタンのクリックやページイベントなどに応答してトリガーすることもできます。

于 2012-05-11T07:41:51.857 に答える
0

私があなたの目標に従えば、問題はデコードではなく、javascriptがダウンロードをトリガーできないという事実にあります。これは、ブラウザ(それ自体)にcontent-dispositionhttpヘッダーを送信できないためです。

次のいずれかを実行できます(私が考えることができます)。

  1. 従来のobject要素を使用してPDFを埋め込みます。jqueryを使用して動的に生成することができます。そして、オブジェクトのソースURLをdata:URIに設定します。

  2. (これは単なる理論です)、window.location.assign('data:xxxコンテンツ処理のないPDFの処理方法に応じて、ユーザーをPDFに誘導するか、ダウンロードをトリガーする)を使用できます。

downloadただし、ajaxリクエストが応答ヘッダーでcontent-dispositionを取得すると、バブルが発生し、ユーザーにダウンロードオプションが表示されるため、データスキーマが不要になると確信しています。

于 2012-05-11T08:06:05.427 に答える