2009-06-06 51 views
5

Tôi có hình ảnh được lưu trữ trong cơ sở dữ liệu của mình trong FILESTREAM và tôi đang cố gắng tìm ra giải pháp tốt nhất là đưa hình ảnh đó trở lại trình duyệt web.Cách nhanh nhất để truyền trực tuyến hình ảnh từ FILESTREAM trong SQL sang trình duyệt là gì?

Nếu tôi được quản lý tập tin trên hệ thống tập tin bản thân mình, cách nhanh nhất sẽ chỉ được:

Response.TransmitFile(pathToFile); 

này không tải các tập tin vào bộ nhớ trước khi truyền nó lại cho khách hàng (sự hiểu biết của tôi) và như vậy là tốt đẹp và nhanh chóng.

Tôi hiện đang sử dụng LINQ to SQL để lấy FILESTREAM. Điều này cung cấp FILESTREAM như một đối tượng nhị phân.

Cho đến nay có cách khá xấu xí này để làm việc đó:

Response.WriteBinary(fileStreamBinary.ToArray()); 

Tôi sẽ khấm khá hơn không làm phiền với LINQ to SQL và làm việc trực tiếp hơn?

Tôi bắt đầu tự hỏi tại sao tôi lại bận tâm với FILESTREAM ngay từ đầu và không chỉ tự quản lý các tệp đó. Tôi chắc chắn có một lý do cho nó mà không sử dụng từ "bandwagon"!

Trả lời

1

này không tải các tập tin vào bộ nhớ trước khi truyền nó trở lại client (để hiểu biết của tôi) và như vậy là tốt đẹp và nhanh chóng.

Đúng, nhưng hãy nhớ đặt Response.BufferOutput thành sai, giá trị mặc định là đúng.

Tôi sẽ tốt hơn không làm phiền với LINQ to SQL và làm việc trực tiếp hơn?

Nếu bạn không muốn tải toàn bộ nội dung nhị phân vào bộ nhớ trước thì có. Đây là an example để truyền trực tuyến dữ liệu nhị phân từ cơ sở dữ liệu (cùng với chức năng tải xuống có thể tiếp tục lại).

Tôi bắt đầu tự hỏi tại sao tôi làm phiền với FileStream trong nơi đầu tiên và không chỉ dính vào việc quản lý các tập tin bản thân mình

Lợi ích đầu tiên là toàn vẹn dữ liệu với sự hỗ trợ giao dịch và bao gồm trong cơ sở dữ liệu sao lưu, do đó bạn không phải lo lắng về sự khác biệt giữa sao lưu cơ sở dữ liệu và sao lưu hệ thống tập tin. Nhược điểm đã luôn luôn được thực hiện, đó là những gì toàn bộ tính năng filestream này đang cố gắng để vượt qua. Mặc dù nếu chúng thấp hơn 1mb trung bình theo this document nó thực sự được lưu trữ nhanh hơn trong cơ sở dữ liệu hơn là trong hệ thống tệp.

Trong Sql Server 2012 có một tính năng mới được gọi là FileTables được xây dựng trên hỗ trợ FileStream. Về cơ bản nó hoạt động giống như một khung nhìn cơ sở dữ liệu của một thư mục hệ thống tập tin trong các tệp được thêm vào thư mục đó được tự động thêm vào cơ sở dữ liệu FileTable (là một bảng lược đồ cố định, chứa một cột nhị phân Filestream cho tệp đó, mà bạn có thể liên kết đến từ các bảng khác). Điều này sau đó sẽ cho phép bạn truy xuất đường dẫn đến tệp mà bạn có thể cấp cho hàm Response.TransmitFile(...) của mình, nhưng vẫn được hưởng lợi từ hỗ trợ luồng phim sql.

1

Điều gì về điều đó?

byte[] buffer = new byte[bufferSize]; 
int nBytes; 
while((nBytes = fileStreamBinary.Read(buffer, 0, bufferSize) != 0) 
{ 
    Response.OutputStream.Write(buffer, 0, nBytes); 
} 

Bằng cách đó bạn không bao giờ tải toàn bộ dòng vào bộ nhớ

+0

Hmmm có lẽ chúng ta đang nói về các loại đối tượng nhị phân khác nhau - LINQ trả về một đối tượng System.Data.Linq.Binary không có phương thức Read(): ( – joshcomley

+0

Xin lỗi, tôi hiểu lầm mẫu mã của bạn và nghĩ rằng fileStreamBinary là một stream ... Tôi không quen thuộc với System.Data.Linq.Binary, nhưng nó có vẻ là lấy toàn bộ bộ đệm cùng một lúc, vì vậy bạn không thể tránh tải nó trong bộ nhớ. Vì vậy, tôi sợ mã bạn tìm thấy "xấu xí" là cách duy nhất ... –

+0

Có vẻ như tôi có thể phải phá vỡ LINQ khi sử dụng FILESTREAM sau đó. Có vẻ ngớ ngẩn khi thấy toàn bộ điểm của FILESTREAM là cho phép siêu nhanh trực tiếp từ đĩa trực tuyến! – joshcomley

0

Về cơ bản các ý tưởng giống như Thomas trình bày, nhưng một chút dài dòng hơn. Việc lưu vào bộ đệm nên được tắt và dữ liệu được cam kết/xóa theo định kỳ để tránh đệm tất cả dữ liệu đến trước khi gửi dữ liệu đến máy khách.

Tôi đang sử dụng mã tương tự như dòng dữ liệu (trong trường hợp này Pdf: s) từ một Blob trong một cơ sở dữ liệu ->Dịch vụ WCF (trực tuyến) ->Khách hàng (Browser)

này có lẽ không phải là cách tiếp cận tốt nhất cho các mục nhỏ hơn, nhưng hữu ích cho việc truyền tải nội dung đến từ một số loại luồng.

Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.Buffer = false; 

var buffer = new byte[BufferSize]; 
int bytesRead; 
while ((bytesRead = inputStream.Read(buffer, 0, BufferSize)) != 0) 
{ 
    if (!Response.IsClientConnected) 
      break; 

    Response.OutputStream.Write(buffer, 0, bytesRead); 
    Response.Flush(); 
} 
Các vấn đề liên quan