Asp.Net Добавление изображений в таблицу SQL ... Что я делаю не так? - PullRequest
0 голосов
/ 08 апреля 2009

Я делал это ранее, но другим способом. Я пытаюсь заставить код ниже работать. Если я не разыграю «OriginalPhoto» или «Thumbnail», произойдет ошибка. Неявное преобразование из типа данных varchar в varbinary (max) не допускается. Используйте функцию CONVERT, чтобы выполнить этот запрос. Я не понимаю, почему его просят бросить. Однако, если я произвожу это, изображения добавляются в базу данных просто отлично в формате двоичных данных. При попытке просмотра изображений я получаю сообщение об ошибке «Невозможно отобразить данные». Я вставил оба байта [] в таблицу с помощью SqlDataAdapter, и это работает. Я хочу использовать этот метод, что я делаю не так?

ТАБЛИЦА ПРОФИЛЕГАЛЛЕРИИ СОДЕРЖИТ:

UserId nvarchar (50)
Название nvarchar (10)
OriginalImage varbinary (max)
ThumbImage varbinary (max)

protected void AddPhotoToDatabase()
{
    byte[] OriginalPhoto = GetImage();
    byte[] Thumbnail = GenerateThumbnail();
    string Title = FileUpload1.FileName.ToString();
    string sql = "INSERT INTO [ProfileGallery] ([UserId], [Title], [OriginalImage], [ThumbImage]) VALUES ('" + User.Identity.Name + "', '" + Title + "', CAST('" + OriginalPhoto + "'AS VARBINARY(MAX)), CAST('" + Thumbnail + "'AS VARBINARY(MAX)))";
    string strCon = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["SocialSiteConnectionString"].ConnectionString;
    SqlConnection conn = new SqlConnection(strCon);
    SqlCommand comm = new SqlCommand(sql, conn);
    conn.Open();
    comm.ExecuteNonQuery();
    conn.Close();
}

protected byte[] GetImage()
{
    byte[] photo = new byte[FileUpload1.PostedFile.ContentLength];
    FileUpload1.PostedFile.InputStream.Read(photo, 0, photo.Length);
    return photo;
}

protected byte[] GenerateThumbnail()
{
    System.Drawing.Image image = System.Drawing.Image.FromStream(FileUpload1.PostedFile.InputStream);
    double thumbwidth = 0;
    double thumbheight = 0;
    double imgsz = 150.0;
    if (imgsz / image.Width < imgsz / image.Height)
    {
        thumbwidth = image.Width * (imgsz / image.Width);
        thumbheight = image.Height * (imgsz / image.Width);
    }
    else
    {
        thumbwidth = image.Width * (imgsz / image.Height);
        thumbheight = image.Height * (imgsz / image.Height);
    }
    System.Drawing.Image thumb = image.GetThumbnailImage((int)thumbwidth, (int)thumbheight, delegate() { return false; }, (IntPtr)0);
    MemoryStream ms = new MemoryStream();
    thumb.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    return ms.ToArray();
}

Ответы [ 5 ]

3 голосов
/ 08 апреля 2009

Вы должны использовать параметры sql:

using( SqlConnection cnn = GetConnection() ) {
    using( SqlCommand cmd = cnn.CreateCommand() ) {
        cmd.CommandText = "INSERT INTO [ProfileGallery] ([UserId], [Title], [OriginalImage], [ThumbImage]) VALUES (@UserId, @Title, @OriginalPhoto, @Thumbnail)";
        cmd.Parameters.AddWithValue( "@UserId", User.Identity.Name );
        cmd.Parameters.AddWithValue( "@Title", Title );
        cmd.Parameters.AddWithValue( "@OriginalPhoto", OriginalPhoto );
        cmd.Parameters.AddWithValue( "@Thumbnail", Thumbnail );

        cnn.Open();
        cmd.ExecuteNonQuery();
        cnn.Close();
    }
}
1 голос
/ 08 апреля 2009

Просто глядя на ваш код, я немного обеспокоен тем, что вы широко открыты для атаки SQL-инъекцией. Чтобы помочь смягчить это также должно исправить вашу проблему. Вам нужно использовать параметризованный запрос. Что-то вроде

cmd.CommandText="Insert into [ProfileGallery]" +
                "(UserId,OriginalPhoto) values (@UserId,@OriginalPhoto)";
cmd.Parameters.AddWithValue("UserId",User.Identity.Name);
cmd.Parameters.AddWithValue("OriginalPhoto",OriginalPhoto);

Причину сбоя вашего кода можно увидеть с помощью этого примера приложения:

static void Main(string[] args)
{
    byte[] byteArray = new byte[] { 1, 2, 0 };
    Console.WriteLine("This is my byte array: " + byteArray);
    Console.ReadLine();
}

Это выводит Это мой байтовый массив: System.Byte []

Я немного шокирован, что вы можете добавить байтовый массив в строку, особенно потому, что он просто дает нам имя типа.

1 голос
/ 08 апреля 2009

Не пытайтесь встраивать данные в запрос вставки. Попробуйте это:

string sql = "INSERT INTO [ProfileGallery] ([UserId], [Title], [OriginalImage],
              [ThumbImage]) VALUES (@userId, @title, @originalImage, @thumbImage)";


string strCon = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["SocialSiteConnectionString"].ConnectionString;

SqlConnection conn = new SqlConnection(strCon);
SqlCommand comm = new SqlCommand(sql, conn);

comm.Parameters.Add(new SqlParameter("@userId", User.Identity.Name));
comm.Parameters.Add(new SqlParameter("@title", Title));
comm.Parameters.Add(new SqlParameter("@originalImage", OriginalPhoto));
comm.Parameters.Add(new SqlParameter("@thumbImage", Thumbnail));
0 голосов
/ 25 мая 2012

Этого простого кода достаточно для вставки изображений в SQL без использования обработчика HTTP

 protected void Page_Load(object sender, EventArgs e)
    {
         if (!IsPostBack)
            {
                BindData();
            }
        }
    private void BindData()
    {
        SqlConnection cn = new SqlConnection("uid=test;pwd=te$t;server=10.10.0.10;database=TestDB");
        string strSQL = "Select * from table6";
        SqlDataAdapter dt = new SqlDataAdapter(strSQL, cn);
        DataSet ds = new DataSet();
        dt.Fill(ds);
        grd1.DataSource = ds;
        grd1.DataBind();
        cn.Close();
    }
protected void btn1_Click(object sender, EventArgs e)
    {
        if(fileupload.HasFile)
        {

            string imageSrc = "~/Image/" +fileupload.PostedFile.FileName;
         string ImageName = txt1.Text;
        SqlConnection cn=new SqlConnection("uid=test;pwd=te$t;server=10.10.0.10;database=TestDB");
        cn.Open();
        string strSql = "Insert Into table6 (ImageName,Image) values ('" + ImageName + "','"+imageSrc+"')";
        SqlCommand cmd = new SqlCommand(strSql, cn);
        cmd.ExecuteNonQuery();
        cn.Close();
        BindData();
        txt1.Text = "";
    }
0 голосов
/ 25 мая 2012
protected void Page_Load(object sender, EventArgs e)
    {
         if (!IsPostBack)
            {
                BindData();
            }
        }
    private void BindData()
    {
        SqlConnection cn = new SqlConnection("uid=test;pwd=te$t;server=10.10.0.10;database=TestDB");
        string strSQL = "Select * from table6";
        SqlDataAdapter dt = new SqlDataAdapter(strSQL, cn);
        DataSet ds = new DataSet();
        dt.Fill(ds);
        grd1.DataSource = ds;
        grd1.DataBind();
        cn.Close();
    }
    protected void btn1_Click(object sender, EventArgs e)
    {
        if(fileupload.HasFile)
        {

            string imageSrc = "~/Image/" +fileupload.PostedFile.FileName;
         string ImageName = txt1.Text;
        SqlConnection cn=new SqlConnection("uid=test;pwd=te$t;server=10.10.0.10;database=TestDB");
        cn.Open();
        string strSql = "Insert Into table6 (ImageName,Image) values ('" + ImageName + "','"+imageSrc+"')";
        SqlCommand cmd = new SqlCommand(strSql, cn);
        cmd.ExecuteNonQuery();
        cn.Close();
        BindData();
        txt1.Text = "";
    }
...