سؤال

Hi everyone i have a problem with my code, i save the image as varbinary ok, but i want the image to show in a picturebox when selected from a fileupload, but i keep on getting a error, is is it possible ? i'm using c# and asp.net. i've been searching but i cant seem get the code working on my source.

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();}
    }
}

}
هل كانت مفيدة؟

المحلول

If the error is memory related, then it's likely because the image data is being disposed with the Stream object when this method exits. Try capturing it into an intermediate Bitmap object and assigning that Bitmap to the PictureBox image property instead.

Here's a link that might help:

Saving Image to MemoryStream- Generic GDI+ Error

Ultimately, this is referenced as an information source:

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

Edit:

I don't know what type "upload1" is or its scope, but assuming it's a local object, I wonder about this approach (this would be a method you'd call to retrieve the Byte[] or the Image):

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;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top