2013-01-23 37 views
18

Tôi đang cố gắng tạo ra một Hình ảnh từ byte [] ra khỏi cơ sở dữ liệu của tôi trong NancyFX thành luồng đầu ra web. Tôi không có mã mẫu đủ gần để hiển thị tại thời điểm này. Tôi đã tự hỏi nếu có ai đã giải quyết vấn đề này và có thể gửi một đoạn? Tôi về cơ bản chỉ muốn trả lại hình ảnh/jpeg từ một mảng byte được lưu trữ trong cơ sở dữ liệu của tôi và đưa nó vào web chứ không phải là một tập tin vật lý.Cách tạo một trình xử lý hình ảnh trong NancyFx

Trả lời

27

chỉ cần để xây dựng trên @ câu trả lời TheCodeJunkie, bạn có thể xây dựng một "phản ứng mảng byte" rất dễ dàng như thế này:

public class ByteArrayResponse : Response 
{ 
    /// <summary> 
    /// Byte array response 
    /// </summary> 
    /// <param name="body">Byte array to be the body of the response</param> 
    /// <param name="contentType">Content type to use</param> 
    public ByteArrayResponse(byte[] body, string contentType = null) 
    { 
     this.ContentType = contentType ?? "application/octet-stream"; 

     this.Contents = stream => 
      { 
       using (var writer = new BinaryWriter(stream)) 
       { 
        writer.Write(body); 
       } 
      }; 
    } 
} 

Sau đó, nếu bạn muốn sử dụng Response.AsX cú pháp đó là một phương pháp mở rộng đơn giản trên đầu trang:

public static class Extensions 
{ 
    public static Response FromByteArray(this IResponseFormatter formatter, byte[] body, string contentType = null) 
    { 
     return new ByteArrayResponse(body, contentType); 
    } 
} 

Sau đó, trong con đường của bạn, bạn có thể chỉ cần sử dụng:

Response.FromByteArray(myImageByteArray, "image/jpeg"); 

Bạn cũng có thể thêm bộ xử lý để sử dụng mảng byte có thương lượng nội dung, tôi đã thêm mẫu nhanh vào đó để this gist

+0

Cảm ơn bạn rất nhiều vì đã mở rộng giải pháp, đó chính xác là những gì tôi cần. – sethxian

+0

Có cách nào để làm cho bộ nhớ cache của trình duyệt đáp ứng mảng byte của yêu cầu không? Vì vậy, trình xử lý sẽ không hoạt động lại cho cùng một url? – Azadrum

+1

Đó là khủng khiếp, bộ nhớ cache của byte trong bộ nhớ. Bạn không thể phát trực tiếp (sử dụng bộ nhớ tối thiểu)? – Todd

8

Từ Nancy, bạn có thể trả lại đối tượng Response mới. Đó là Content tài sản là loại Action<Stream> vì vậy bạn chỉ có thể tạo ra một đại biểu rằng viết mảng byte của bạn để dòng mà

var r = new Response(); 
r.Content = s => { 
    //write to s 
}; 

Đừng quên để thiết lập ContentType sở hữu (bạn có thể sử dụng MimeTypes.GetMimeType và vượt qua nó tên, kể cả mở rộng) Ngoài ra còn có một StreamResponse, được thừa kế từ Response và cung cấp một constructor khác nhau (ví một chút cú pháp đẹp hơn bạn có thể sử dụng return Response.AsStream(..) trong lộ trình của bạn .. chỉ cú pháp kẹo)

+0

Cảm ơn bạn đã trợ giúp, tôi thích các giải pháp thay thế bạn đã trình bày. – sethxian

+0

Có vẻ như tên thuộc tính đã thay đổi thành 'Nội dung'. – TrueWill

11

Trong bộ điều khiển của bạn, trả về Response.FromStream với luồng byte của hình ảnh. Nó được sử dụng để được gọi là AsStream trong các phiên bản cũ của nancy.

Get["/Image/{ImageID}"] = parameters => 
{ 
    string ContentType = "image/jpg"; 
    Stream stream = // get a stream from the image. 

    return Response.FromStream(stream, ContentType); 
}; 
+0

Bạn phải đóng luồng nguồn bằng API này như thế nào? Khủng khiếp. – Todd

+2

Luồng nguồn được xử lý tự động sau này --ttg: //github.com/NancyFx/Nancy/issues/786 – Todd

+1

Bạn phải đảm bảo rằng vị trí dòng được đặt ở đầu luồng: 'stream.Seek (0, SeekOrigin.Begin) ', vì' FromStream' sẽ không làm điều đó cho bạn. –

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