2011-12-16 34 views
6

Tôi đang cố gắng hiển thị hình ảnh được tìm nạp từ cơ sở dữ liệu dưới dạng luồng nhị phân, trên biểu mẫu web. Bạn có thể làm sáng tỏ về điều này!hiển thị luồng nhị phân được lấy từ cơ sở dữ liệu dưới dạng "hình ảnh" bên trong html dưới dạng thẻ <img>

Tôi đang làm việc trên một dự án nơi người dùng có hồ sơ và mọi người dùng đều có ảnh tiểu sử của riêng họ được hiển thị trong trang chủ. Bức ảnh này xuất phát từ cơ sở dữ liệu.

đây là mã tôi đã sử dụng để nhận luồng!

TestDBDataContext context1 = new TestDBDataContext(); 

      var r = (from a in context1.ImageTables where a.Id == 8 select a).First(); 

      MemoryStream stream = new MemoryStream(r.FileImage.ToArray()); 

nhờ

Trả lời

4

Những gì tôi đã làm trong quá khứ được thiết lập url hình ảnh đến một trang aspx, như vậy:

<img src="getLogo.aspx" alt="Logo" /> 

Sau đó, trong code-behind cho getLogo.aspx, tôi đã thực hiện những điều sau đây :

Response.BinaryWrite(imageData); 
Response.ContentType = "image/gif"; 

đâu imageData là hình ảnh của bạn như là một mảng byte

+0

mà wud tạo ra một bài viết trở lại mọi lúc, đúng! –

+1

Không, không có dữ liệu nào được gửi lại thông qua POST. –

+0

cảm ơn, đây là những gì tôi đang tìm kiếm! –

3

tôi sẽ lưu hình ảnh vào một thư mục trong trang web có thể truy cập để người gọi bên ngoài (tức là một thư mục con hình ảnh) sử dụng một tên vô nghĩa (ví dụ như khóa chính của các bản ghi trong cơ sở dữ liệu hoặc GUID), sau đó thêm một href vào tệp này trong trang web.

+0

cảm ơn, nhưng nếu tôi đã làm điều đó tại sao wud tôi lưu trong cơ sở dữ liệu ở tất cả?Tôi biết đó là một cách tiếp cận để làm điều đó nhưng tôi đang tìm kiếm một cái gì đó tốt hơn, bất kỳ ý tưởng? –

+1

@ShaneAdrianMuaz: Một vài lý do tôi có thể nghĩ đến: 1) Cuối cùng bạn có thể có nhiều máy chủ web, do đó bạn không phải phối hợp các tệp trên mỗi máy chủ; 2) Bạn có thể di chuyển đến một máy chủ web hoặc nền tảng mới, vì vậy một lần nữa không phải quản lý tập tin là đáng giá; 3) nếu hình ảnh đại diện cho một cái gì đó liên quan đến doanh nghiệp, bạn có thể cần/muốn đại diện cho họ trong một ứng dụng khách khác, chẳng hạn như ứng dụng máy tính bảng hoặc ứng dụng máy tính bảng. –

+1

Có, nhưng đưa ra tất cả những lý do đó (họ đã chọn để lưu nó trong DB) tại sao có nó như là một tập tin trong webroot? Đó là một chút lạ. –

7

Base64 mã hóa nhị phân của bạn và chèn trong thẻ hình ảnh như sau (thay đổi Mimetype cho phù hợp):

<img src="data:image/gif;base64,BASE64 ENCODED BINARY HERE"> 

Đây là cách bạn sẽ làm điều đó, nhưng tôi sẽ không làm điều này như một số trình duyệt không thể xử lý nó (IE6). Bạn nên tiết kiệm cho một tập tin đầu tiên và làm theo cách thông thường.

+0

Tôi thấy, do đó, ngoài việc lưu hình ảnh và liên kết đến đó, có cách nào khác để làm điều này không? nói có thể được sử dụng một httphandler hoặc somethn? –

+1

Tôi nghĩ rằng DJ Quimby có cách tiếp cận đúng, trong PHP tôi sẽ tạo một kịch bản lấy tên hình ảnh làm tham số truy vấn, truy lục nhị phân từ kho dữ liệu và trả về trình duyệt, thiết lập tiêu đề kiểu nội dung bằng đúng mimetype. –

1

Lưu Memory Suối nộp sử dụng:

MemoryStream memoryStream = new MemoryStream(); 
    using (FileStream fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.Write)) 
    { 
     memoryStream.SaveTo(fileStream); 
    } 

Sau đó đặt tên tập tin trong html.

+0

tôi xin lỗi, nhưng tôi đã không nhận được điểm của bạn ở đây, bạn có thể vui lòng giải thích một chút lil? –

1

Đầu tiên có một tập tin .aspx riêng biệt cho hình ảnh (thực sự tôi muốn ủng hộ một tình trạng quá tải IHttpHandler cho điều này, nhưng nguyên tắc là sam e và chúng ta chỉ giới thiệu một khái niệm mới tại một thời điểm).

Tệp .aspx sẽ kế thừa từ mã sau và không có nội dung. Vì vậy, nó sẽ có chỉ thị <%@ Page %> và không có gì khác.

Trong mã sau, trong trình xử lý sự kiện tải trang, lấy hình ảnh và đặt loại nội dung của phản hồi thành giá trị thích hợp (hoặc nếu tất cả hình ảnh là hình ảnh/png, bạn có thể chỉ là mã cứng). Sau đó ghi hình ảnh vào đầu ra.

TestDBDataContext context1 = new TestDBDataContext(); 
int id; 
if(int.TryParse(Request.QueryString["id"], out id)) 
{ 
    var r = (from a in context1.ImageTables where a.Id == 8 select a).FirstOrDefault(); 
    if(r != null) 
    { 
    Response.ContentType = r.ContentType; 
    Response.BinaryWrite(r.FileImage.ToArray()); 
    return; 
    } 
} 
//code to handle 404 not found for no such image here (send error message or Server.Transfer to error page, etc. 

Sau đó, bạn có thể sử dụng điều này với <img src="profileImg.aspx?id=8" alt="" />, vv

Một cải tiến hiệu suất là để có được byte một đoạn 4k tại một thời điểm từ cơ sở dữ liệu và viết chúng vào Response.OutputStream, chứ không phải là một mảng lớn trong bộ nhớ. Đối với các tập tin nhỏ sự khác biệt là không quan trọng, nhưng đối với các tập tin rất lớn nó có thể được đáng kể (như trong "hurray bây giờ máy chủ web của tôi không rơi nhiều lần nữa!" Đáng kể).

+0

Nếu tôi làm điều này trong một người tán thành thì điều gì sẽ là sự khác biệt? –

+1

Đó là hơi nhẹ hơn và sạch hơn trong trường hợp bạn đang khá nhiều chỉ cần làm một nhiệm vụ đơn giản trong phản ứng. Trên thực tế, các trang aspx là tất cả các triển khai IHttpHandler, với một loạt các chức năng hữu ích khác. Một khi bạn đang hạnh phúc, bạn biết làm thế nào để giải quyết vấn đề hiện tại của bạn, tôi khuyên bạn nên thử nó theo cách HttpHandler. Rất có thể lần đầu tiên nó sẽ có vẻ giống như một biến chứng thêm, nhưng một khi bạn đã quen với chúng, chúng có vẻ đơn giản hơn cho những trường hợp như thế này. –

+0

cảm ơn rất nhiều, điều này thực sự hleps –

Các vấn đề liên quan