2012-01-13 87 views
2

我創建了一個ASP.NET/C#應用程序將圖像上傳到MySQL數據庫。該過程執行時沒有任何錯誤,但對於我上傳的任何圖像,我得到的是100x100白色圖像的輸出。我遵循的程序是。從數據庫中存儲和檢索圖像

1)創建了一個數據庫,其中字段picture和類型Binary(255)

2)上傳的圖像作爲cmd.Parameters.Add("@picture", OdbcType.Binary, 255).Value = FileUpload1.FileBytes;

3)上述被插入一個新的記錄,併產生以下類型的有價值的東西做。 89504e470d0a1a0a0000000d49484452000002600000010008020000009b155d400000100049444154789cd4dc05745b57a2377a15c26088d99651b2248b999959b2c0966cc9cccccc8e1ddb01439899d3a4499a869999e33037d0340d34d4b4d5dbaee7e6f6b5337367eefad67bf3adf55f676dd98e221f6b9ddffeef738e20db5cbf826c77fd3638d8eafa6587ebd79daedfc0f6afd9eefae5ab372fd6bf7db9e5e7b7075dae4daf5e1c76b98ebb5cfb7ef935a5b31b028b32ea53f6ec3a77efe60fb919156e34222b297ee3aedd2e97ebe6dd870b96acd8b0efc0891bb76ae7ce8ba9a8dc70f1f2c917afaeb95ce75c1f276cd988b0180329c4c4aaf2d2

// ---------------上傳模塊完成----------------- //

1 )創建一個ASPX頁面

<asp:Image ID="img" runat="server" ImageUrl="~/MyImage.ashx" />

2)左ASPX.CS文件,而無需任何代碼

3)增加了一個ASHX文件,

<%@ WebHandler Language="C#" Class="MyImage" %> 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.IO; 
using System.Drawing.Imaging; 

public class MyImage : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.ContentType = "image/png"; 
     var data = "89504e470d0a1a0a0000000d49484452000002600000010008020000009b155d400000100049444154789cd4dc05745b57a2377a15c26088d99651b2248b999959b2c0966cc9cccccc8e1ddb01439899d3a4499a869999e33037d0340d34d4b4d5dbaee7e6f6b5337367eefad67bf3adf55f676dd98e221f6b9ddffeef738e20db5cbf826c77fd3638d8eafa6587ebd79daedfc0f6afd9eefae5ab372fd6bf7db9e5e7b7075dae4daf5e1c76b98ebb5cfb7ef935a5b31b028b32ea53f6ec3a77efe60fb919156e34222b297ee3aedd2e97ebe6dd870b96acd8b0efc0891bb76ae7ce8ba9a8dc70f1f2c917afaeb95ce75c1f276cd988b0180329c4c4aaf2d2"; 
     var buffer = StringToByteArray(data); 
     context.Response.OutputStream.Write(buffer, 0, buffer.Length); 
    } 

    private byte[] StringToByteArray(string hex) 
    { 
     return Enumerable 
      .Range(0, hex.Length) 
      .Where(x => x % 2 == 0) 
      .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) 
      .ToArray(); 
    } 
    public bool IsReusable 
    { 
     get { return false; } 
    } 
} 

通過執行此代碼,任何彩色輸入的輸出中都會顯示一個白色的100x100圖像。我複選了ContentType並上傳了各種尺寸和格式的各種圖像,但無論我做什麼,我都得到了相同白色圖像的輸出。我的代碼有什麼問題?任何更正?

+1

不是在MySQL的專家,但你創建與255bytes的最大長度列?因此最大圖像大小確實是255字節? – kolin 2012-01-13 11:42:25

+0

MySQL不允許超過255的二進制文件的長度 – 2012-01-13 13:10:25

回答

1

您可以嘗試將圖像保存爲Base64編碼的字符串,然後在您希望在網頁上呈現圖像時將其轉換回圖像。

下面是如何做到這一點的鏈接。

Base64String to Image and visa versa

這裏是一個link如何,我用它在我的項目,不完全從圖像或從數據庫,但概念是相同的。

在使用我的方法在自己的網頁,你會使用

<img src="${downloadurl}" /> 
+0

這比編寫大量代碼要好。謝謝哥們! – 2012-01-13 16:53:54

+0

不客氣!祝一切順利! – 2012-01-14 14:12:54

0

我在拉的圖像數據,並從MSSQL數據庫

public void ProcessRequest(HttpContext context) 
    { 
     Guid picid; 
     if (context.Request.QueryString["picid"] != null) 
      picid = new Guid(context.Request.QueryString["picid"]); 
     else 
      throw new ArgumentException("No parameter specified"); 

     context.Response.ContentType = "image/jpeg"; 
     Stream strm = ShowPicImage(picid); 
     byte[] buffer = new byte[4096]; 
     int byteSeq = strm.Read(buffer, 0, 4096); 

     while (byteSeq > 0) 
     { 
      context.Response.OutputStream.Write(buffer, 0, byteSeq); 
      byteSeq = strm.Read(buffer, 0, 4096); 
     } 
    } 

    public Stream ShowPicImage(Guid piciddata) 
    { 
     ProductPicture pictureData = new ProductPicture("ProductPictureID", piciddata); 
     object img = pictureData.Data; 
     try 
     { 
      return new MemoryStream((byte[])img); 
     } 
     catch 
     { 
      return null; 
     } 
    } 

我不知道,如果它的東西,你可以嘗試爲您的問題顯示出來一個ASHX這種代碼。 (凡pictureData.Data屬性類型是一個byte []和相關的數據庫列是VARBINARY(MAX))

更新答案

您可能還需要考慮存儲在數據庫作爲數據一個BLOB

0

一個255字節的二進制字段類型不會足夠大,除了最小的圖像之外的任何東西。檢查您正在上傳的文件的大小,並相應地重新調整字段的大小。

相關問題