0

クライアント側でデータベースから画像を表示しようとしていますが、私が見つけた多くの種類の例を使用してきましたが、どれも機能せず、表示された画像もありません。私が見た最後の例はこれです: http://www.codeproject.com/Tips/445876/Auto-bind-byte-to-asp-Image

私は例を完全に理解していますが、画像はまだ表示されていません。

誰かがこの問題について少し助けてくれますか?

要約すると、HTML5 のドラッグ アンド ドロップ ファイルを使用しています。FormData オブジェクトの XMLHttpRequest を介してファイルを送信します。1 つのハンドラーがこのファイルを byte() で取得し、SQL データベースに格納します。

クライアントコード:

$("#btnUploadFile").click(function () {
    if (files.length <= 0) {
        alert("Debe seleccionar algún fichero para subirlo.");
    } else {
        var expID = $("#ContentPlaceHolder1_hfExpId").val();
        var formData = new FormData();
        for (var i = 0; i < files.length; i++) {
            alert(files[i].name);
            formData.append('file', files[i]);
        }
        var xhr = new XMLHttpRequest();
        xhr.open('POST', "FileHandler.ashx", true);
        xhr.overrideMimeType('text/plain; charset=x-user-defined-binary');
        xhr.setRequestHeader("ExpedienteID", expID);
        xhr.onload = function () {
            if (xhr.status === 200) {
                RefreshFilePanel();
            } else {
                console.log('Something went terribly wrong...');
            }
        };
        xhr.send(formData);
    };

ハンドルコード:

    Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
    Dim documentBytes As Byte()
    Dim lExpId As String = context.Request.Headers("ExpedienteID")
    Dim fLenght As Integer

    If (context.Request.Files.Count > 0) Then
        Dim files As HttpFileCollection = context.Request.Files

        For i = 0 To files.Count - 1
            fLenght = files(i).ContentLength
            documentBytes = New Byte(fLenght - 1) {}
            context.Request.InputStream.Read(documentBytes, 0, fLenght)
            UploadDocumentBy_ExpID(documentBytes, files(i).FileName, "Description" & lExpId.ToString, lExpId)
        Next
    End If
End Sub

もっと遅く、この byte() をグリッドのイメージタグに入れようとしました。

aspx コード:

<asp:GridView ID="grdDocumentoByExp" runat="server" AutoGenerateColumns="false" Width="250px" DataSourceID="dtsDocumentByExpId">
<Columns>
    <asp:BoundField DataField="Archivo" HeaderText="Archivo" />
    <asp:BoundField DataField="docId" HeaderText="docId" />
    <asp:BoundField DataField="Documento" HeaderText="Documento" Visible="false" />
    <asp:TemplateField HeaderText="Preview">
        <ItemTemplate>
           <asp:Image 
               ID="imgThumb" 
               runat="server"
               ImageUrl='<%# GetImage(Eval("Documento")) %>'
               />
        </ItemTemplate>
    </asp:TemplateField>

</Columns>

コードビハインドの GetImage 関数:

    Public Function GetImage(image As Object) As String
    Return "data:image/gif;base64," & Convert.ToBase64String(DirectCast(image, [Byte]()))
End Function

すべてのステップでエラーはありませんが、エラーは byte() ファイル形式にある可能性があると思います..しかし、よくわかりません。

誰か助けて?

英語で申し訳ありませんが、ありがとうございます。

4

1 に答える 1

0

問題は、ファイルの読み取り方法にあります。

context.Request.InputStream.Read(documentBytes, 0, fLenght)

このReadメソッドは、読み取ったバイト数を返します。これは、要求したバイト数よりも少ない場合があります。すべてのバイトを取得するまでループする必要があります。

Dim offset as Integer = 0
Dim len as Integer
Do While offset < fLength
  len = context.Request.InputStream.Read(documentBytes, offset, fLenght - offset)
  offset += len
Loop
于 2013-02-27T12:06:26.453 に答える