将图像存储在DataTable中,在GridView中显示,最终存储在DB中

时间:2014-04-17 09:42:14

标签: c# image-processing binary

我需要允许用户将文件上传到服务器。这些是图像文件,在它们存储在数据库之前,我需要用户提供有关他们上传的图像的其他信息。

到目前为止,我有一个HTML 5多文件上传:

<asp:FileUpload ID="fuTestUpload" AllowMultiple="true" runat="server" />

我正在显示文件名和下拉列表,用户可以在其中选择要上传的图像类别:

<asp:GridView ID="gvHierarchy" AutoGenerateColumns="false" OnRowDataBound="gvHierarchy_RowDataBound" runat="server">
        <Columns>
            <asp:TemplateField HeaderText="Choose Files">
                <ItemTemplate>
                    <asp:CheckBox Id="chkBox" runat="server"/>
                </ItemTemplate>
            </asp:TemplateField>

            <asp:TemplateField HeaderText="Assigned Location">
                <ItemTemplate>
                    <asp:DropDownList ID="ddl" Width="150" runat="server">
                        <asp:ListItem Text="-- select --" Value="0"></asp:ListItem>
                    </asp:DropDownList>
                </ItemTemplate>
            </asp:TemplateField>

            <asp:TemplateField HeaderText="File Path">
                <ItemTemplate>
                    <asp:Label Id="lblFilePath"  runat="server" Text='<%#Eval("FilePath")%>'/>
                </ItemTemplate>
            </asp:TemplateField>          

            <asp:TemplateField HeaderText="Location Image">
                <ItemTemplate>
                    <asp:Image Id="imgLocation" runat="server" Width="200" ImageUrl='<%#Eval("ImageData")%>'/>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

我在此处将图像填充回网格视图:

protected void btnUpload_Click(object sender, EventArgs e)
{
    if (fuTestUpload.HasFiles)
    {
        DataTable dt = new DataTable();
        dt.Clear();
        dt.Columns.Add("FilePath");
        dt.Columns.Add("ImageData");

        foreach (HttpPostedFile file in fuTestUpload.PostedFiles)
        {
            DataRow dr = dt.NewRow();
            dr["FilePath"] = file.FileName.ToString();
            Byte[] bImage = new Byte[file.ContentLength];
            Stream myStream = file.InputStream;
            myStream.Read(bImage, 0, file.ContentLength);
            dr["ImageData"] = myStream;
            dt.Rows.Add(dr);
        }

        Session["UploadedImageData"] = dt;
        populateGrid(dt);
    }
}

但是这不起作用,它是空白或各种字节/流错误。

知道如何实现这个目标吗?

解决此问题

if (fuTestUpload.HasFiles)
    {            
        foreach (HttpPostedFile file in fuTestUpload.PostedFiles)
        {
            byte[] bImage = new byte[file.ContentLength];
            file.InputStream.Read(bImage, 0, file.ContentLength);

            success = myClass.TempStoreLocationImages(bImage, file.FileName.ToString());                
        }      
    }

赞赏有关赏金奖励的答案,因为我不确定。

2 个答案:

答案 0 :(得分:0)

&#34;空白&#34;字节/流错误的错误使我认为问题是进一步上升的链。上传是否在Ajax容器中?你可以在Upload方法调用的第一行粘贴一个断点,并点击该断点吗?如果答案是否定的,请打开像Fiddler这样的Http调试器,并确认流量是否正确地进入调试服务器。

答案 1 :(得分:0)

数据表中的列类型错误。

这意味着您正在存储byte []的字符串表示形式(System.Byte[]字符串)。

使用:

 dt.Columns.Add("ImageData", typeof(byte[]));