【问题标题】:Destination array was not long enough. Check destIndex and length, and the array's lower bounds目标数组不够长。检查 destIndex 和长度,以及数组的下限
【发布时间】:2014-06-29 01:21:05
【问题描述】:

我正在尝试将图像及其属性和几个文本框插入数据库。这是 HTML 代码:

          <span class="label"><label for="FirstName">First Name: </label></span>
          <asp:TextBox ID="FirstName" runat="server"></asp:TextBox>
          </div>
           <div class="row">
          <span class="label"><label for="Surname">Surname: </label></span>
          <asp:TextBox ID="Surname" runat="server"></asp:TextBox>
          </div>
          <div class="row">
          <span class="label"><label for="PhotoUpload">Photo: </label></span>
          <asp:FileUpload ID="PhotoUpload" runat="server" />
          </div>
          <div class="row">
          <span class="label">&nbsp;</span>
          <asp:Button ID="Button1" runat="server" Text="Submit" onclick="Button1_Click" />

代码隐藏:

    protected void Button1_Click(object sender, EventArgs e)
    {
if (PhotoUpload.HasFile)
    {
      Stream photoStream = PhotoUpload.PostedFile.InputStream;
      int photoLength = PhotoUpload.PostedFile.ContentLength;
      string photoMime = PhotoUpload.PostedFile.ContentType;
      string photoName = Path.GetFileName(PhotoUpload.PostedFile.FileName);
      byte[] photoData = new byte[photoLength - 1];
      photoStream.Read(photoData, 0, photoLength);

   string CS = ConfigurationManager.ConnectionStrings["mm"].ConnectionString;
   using (SqlConnection con = new SqlConnection(CS))
   {
       con.Open();
       SqlCommand cmd = new SqlCommand("spLogo", con);
       cmd.CommandType = CommandType.StoredProcedure;
       cmd.Parameters.AddWithValue("@FName", FirstName.Text);
       cmd.Parameters.AddWithValue("@SName", Surname.Text);
       cmd.Parameters.AddWithValue("@PData", photoData);
       cmd.Parameters.AddWithValue("@PName", photoName);
       cmd.Parameters.AddWithValue("@PLength", photoLength);
       cmd.Parameters.AddWithValue("@PMime", photoMime);
       cmd.ExecuteNonQuery();
   }
}

这可能是什么问题?

这是我的存储过程:

       alter procedure spLogo
       @FName nvarchar(50),
       @SName nvarchar(50),
       @PData VarBinary(max),
       @PName nvarchar(50),
       @PLength int,
       @PMime nvarchar(50) 
       as
       begin
       Insert into Employee2 values(@FName,@SName,@PData,@PName,@PLength,@PMime)
       END

我是第一次处理图像,所以我不确定哪种数据类型最好,但这是我能想到的最好的代码。

【问题讨论】:

  • 您在哪一行得到错误? photoStream.Read(photoData, 0, photoLength); ??
  • photoData 小于 PhotoUpload.PostedFile.InputStream... 也许?
  • 那么我怎样才能确保它支持所有尺寸的图像。我不知道使用 VarBinary(max) 在这里是否有任何作用。
  • 选中此项以将文件上传保存到字节 [],stackoverflow.com/questions/3068303/fileupload-to-filestream,Varbinary(max) 似乎不是问题......也许你可以尝试/抓住这个块......跨度>

标签: asp.net sql-server image


【解决方案1】:

这一行可能是根本原因,因为您正在创建一个长度小于图像长度的byte 数组。

byte[] photoData = new byte[photoLength - 1];

假设照片长度为 1000,因此您正在创建 999 大小的字节数组 (photoData),现在当下面的行尝试将第 1000 个字节复制到 photoData 时,它将失败。

photoStream.Read(photoData, 0, photoLength);

您应该创建与图像长度相同的字节数组。希望它有效。

byte[] photoData = new byte[photoLength];

【讨论】:

    猜你喜欢
    • 2016-04-08
    • 2022-01-23
    • 2019-09-12
    • 1970-01-01
    • 2020-03-16
    • 2020-01-07
    • 2013-08-29
    • 2012-05-08
    • 2012-08-02
    相关资源
    最近更新 更多