【问题标题】:Store Image in DataTable, Show in GridView, Eventually Store in DB将图像存储在 DataTable 中,在 GridView 中显示,最终存储在 DB 中
【发布时间】:2014-06-01 12:29:05
【问题描述】:

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

到目前为止,我有一个 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());                
        }      
    }

感谢有关赏金奖励的建议,因为我不确定。

【问题讨论】:

  • btnUpload_Click 代码是否应该改为:dr["ImageData"] = bImage;
  • 我尝试了两个 Simon,但都没有成功 - 但是验证二进制数据是否正确存在固有的困难!

标签: c# image-processing binary


【解决方案1】:

字节/流错误的“空白”错误让我认为问题在链条上更进一步。上传是在 Ajax 容器中吗?你能在 Upload 方法调用的第一行设置一个断点,然后点击那个断点吗?如果答案是否定的,请打开像 Fiddler 这样的 Http 调试器并确认流量正确地到达您的调试服务器。

【讨论】:

  • 上传在上面的代码中,它是 ASP.NET 上传控件,但是我现在更关注这个控件以及如何从上传控件获取数据并将其转换为二进制数据以进行存储.
【解决方案2】:

数据表中的列类型错误。

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

用途:

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

【讨论】:

    猜你喜欢
    • 2020-12-08
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2013-12-04
    • 2021-04-30
    • 2020-04-16
    • 2021-02-02
    • 2017-01-22
    相关资源
    最近更新 更多