2013-05-28 53 views
1

嗨,大家我有我的代码有问题,我保存为varbinary图像确定,但我希望图像显示在一个图片框从fileupload中选择时,但我一直得到一个错误,这可能吗?我使用的是C#和asp.net。我一直在寻找,但我似乎无法让我的源代码工作。检索varbinary数据c#图片框

using System; 
using System.Data; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Web.UI.WebControls; 
using System.IO; 
using System.Drawing; 

public partial class Mensagem : System.Web.UI.Page 
{   
    protected void BtnUploadClick(object sender, EventArgs e) 
    { 
     string filePath = Server.MapPath(upload1.FileName); 
     string filename = Path.GetFileName(filePath); 
     string ext = Path.GetExtension(upload1.PostedFile.FileName); 
     Stream fs = upload1.PostedFile.InputStream; 
     BinaryReader br = new BinaryReader(fs); 
     Byte[] bytes = br.ReadBytes((Int32)fs.Length); 
     string dt = DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss");  

     SqlConnection conn = new SqlConnection("Data Source=Microsoft SQL Server (SqlClient);Server=NEVETS-LAPTOP\\NEVETS;Initial Catalog=Forum;uid=sa;pwd=sql;Connect Timeout=10;TrustServerCertificate=True "); 
       conn.Open(); 

      SqlCommand sqlCommand = conn.CreateCommand(); 
      sqlCommand.CommandType = CommandType.StoredProcedure; 
      sqlCommand.CommandText = "usp_inserirFicheiro";     
      sqlCommand.Parameters.AddWithValue("@nome", SqlDbType.VarChar).Value = filename; 
      sqlCommand.Parameters.AddWithValue("@tamanho", SqlDbType.VarBinary).Value = bytes; 
      sqlCommand.Parameters.AddWithValue("@formato", SqlDbType.VarChar).Value = ext; 
      sqlCommand.Parameters.AddWithValue("@data", SqlDbType.DateTime).Value = dt; 
      sqlCommand.Parameters.AddWithValue("@ficheiro", SqlDbType.VarBinary).Value = br;        
      sqlCommand.ExecuteNonQuery(); 
      txtnome.Text = "sucesso"; 

      conn.Close(); 

    } 


    protected void Button2_Click(object sender, EventArgs e) 
    { 
     //upload1.SaveAs(Server.MapPath("~/imgs/" + upload1.FileName).ToString()); 
     //pbficheiro.ImageUrl = @"~/imgs/" + upload1.FileName; 


Byte[] ba = new BinaryReader(upload1.PostedFile.InputStream).ReadBytes((Int32)upload1.PostedFile.InputStream.Length); 
using (MemoryStream ms = new MemoryStream(ba, false)) 
{ 
    Image imgTmp = Image.FromStream(ms); 
    Bitmap bm = new Bitmap(imgTmp.Width, imgTmp.Height); 
    Graphics g = Graphics.FromImage(bm); 
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
    g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; 
    Rectangle rect = new Rectangle(0, 0, imgTmp.Width, imgTmp.Height); 
    g.DrawImage(imgTmp, rect, 0, 0, imgTmp.Width, imgTmp.Height, GraphicsUnit.Pixel); 

    using (MemoryStream ms2 = new MemoryStream()) 
    { 
     bm.Save(ms2, imgTmp.RawFormat); 
      bm.Dispose(); 
      imgTmp.Dispose(); 
      if (WantAnImage) 
       return Image.FromStream(ms2); 
      else (WantBytes) 
       ms2.ToArray();} 
    } 
} 

} 
+0

pbficheiro是我的PictureBox的,不应该也呈现出加载图像从文件上传? – user2427935

回答

0
因为

的图像数据被设置成与流对象时此方法退出如果错误存储器相关的,则很可能。尝试将其捕获到中间位图对象中,并将该位图分配给PictureBox图像属性。

这里有一个链接,可以帮助:

http://msdn.microsoft.com/en-us/library/z7ha67kw

编辑:

我不

Saving Image to MemoryStream- Generic GDI+ Error

归根结底,这是作为一个信息源引用t知道什么类型的“upload1”是或其范围,但是荷兰国际集团是本地的对象,我想知道这个方法(这将是你会打电话来检索字节]或图像的方法):

protected void Button2_Click(object sender, EventArgs e) 
{ 
    //upload1.SaveAs(Server.MapPath("~/imgs/" + upload1.FileName).ToString()); 
    //pbficheiro.ImageUrl = @"~/imgs/" + upload1.FileName; 

    Byte[] ba = new BinaryReader(upload1.PostedFile.InputStream).ReadBytes((Int32)upload1.PostedFile.InputStream.Length); 
    using (MemoryStream ms = new MemoryStream(ba, false)) 
    { 
     System.Drawing.Image imgTmp = System.Drawing.Image.FromStream(ms); 
     Bitmap bm = new Bitmap(imgTmp.Width, imgTmp.Height); 
     Graphics g = Graphics.FromImage(bm); 
     g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
     g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
     g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; 
     Rectangle rect = new Rectangle(0, 0, imgTmp.Width, imgTmp.Height); 
     g.DrawImage(imgTmp, rect, 0, 0, imgTmp.Width, imgTmp.Height, GraphicsUnit.Pixel); 
       bm.Save(Server.MapPath("~/imgs/" + upload1.FileName).ToString()); 
       pbficheiro.ImageUrl = @"~/imgs/" + upload1.FileName; 
    } 
} 
+0

感谢您的答案,即时尝试要做的是这 protected void Button2_Click(object sender,EventArgs e) { upload1.SaveAs(Server.MapPath(“〜/ imgs /”+ upload1.FileName).ToString( )); pbficheiro.ImageUrl = @“〜/ imgs /”+ upload1.FileName; 但是不需要在本地保存文件...我希望你能理解... – user2427935

+0

这与你原来的发布代码有点不同。但是第一次尝试并不坏,我只是担心记忆丢失了。它不需要本地保存(我的建议也没有)。您只需将该内存交给不会立即处理的内容,例如将其传递给本地Bitmap对象或某些不依赖MemoryStream的类似构造。 – DonBoitnott

+0

感谢您的快速回答,我一直试图从记忆中得到它,就像你说的,但我不认为我得到它的权利......我不断在我的代码上得到错误。不能隐含转换类型...任何建议? – user2427935