2010-02-10 41 views
10

Tôi muốn đẩy tệp vào trình duyệt từ trang web bằng cách sử dụng dịch vụ web. Tôi hiện đang đọc các tập tin vào một mảng byte base64, và trả lại từ webservice. Webservice này được gọi từ một trang web và tôi bị kẹt về cách đẩy tệp này dưới dạng tệp gốc vào trình duyệt. Lý tưởng nhất là tôi muốn đọc các mảng byte vào một dòng bộ nhớ, và sau đó chỉ cần viết nó vào dòng Response nếu có thể để người dùng cuối chỉ cần tải các tập tin.Tải xuống tệp từ webservice - trong trang web ASP.NET

+0

Và những gì là vấn đề bạn đang gặp phải với cách tiếp cận đó? Bạn đã không hỏi một câu hỏi, vì vậy điều này có thể sẽ đóng cửa khá nhanh chóng. – Oded

Trả lời

12

Đầu tiên, thay vì gửi mảng byte base64, hãy dịch vụ web của bạn chỉ cần trả về một mảng byte cho tệp của bạn. Response.OutputStream.Write() sẽ tự động base64 mã hóa các byte của bạn, do đó bạn cũng có thể yêu cầu chúng không được mã hóa trong luồng bộ nhớ của bạn.

Thứ hai, bạn sẽ cần nhiều hơn chỉ các byte. Bạn sẽ cần siêu dữ liệu được liên kết với tệp. Đối với đoạn mã dưới đây, tôi đã đặt tất cả siêu dữ liệu đó vào một lớp riêng biệt (ví dụ cục bộ có tên là "tệp"). Sau đó, chỉ cần sử dụng đoạn mã này, sau khi bạn có dữ liệu bạn cần:

Response.Clear(); 
Response.ClearHeaders(); 
Response.ContentType = file.ContentType; 
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.FileName + "\""); 
Response.AddHeader("Content-Length", file.FileSize.ToString()); 
Response.OutputStream.Write(file.Bytes, 0, file.Bytes.Length); 
Response.Flush(); 
Response.End(); 
+3

Cẩn thận với phản hồi.End() http://stackoverflow.com/questions/1087777/is-response-end-considered-harmful –

+0

@Todd Smith: Cảm ơn con trỏ. Tôi đã nhận thức được vấn đề, nhưng bạn đúng rằng những người khác có thể không; nó có thể là một bản ghi nhớ nghiêm túc. Tuy nhiên, trong trường hợp tải xuống tệp, không có quá trình xử lý nào khác mà bạn muốn hoặc nên thực hiện và do đó 'Response.End()' * là * có khả năng là cuộc gọi chính xác. Nó chắc chắn là trong trường hợp của tôi. – Randolpho

+2

Tôi có nên sử dụng Response.Close() thay vì Repsonse.End() sau đó không? – user210757

3

Có thể, bạn sẽ cần phải chắc chắn rằng bạn thiết lập một cách rõ ràng ContentType của HttpResponse, ví dụ:

Response.ContentType = "image/jpeg"; 
Response.OutputStream.Write(buffer, 0, buffer.Length); 

Nếu bạn muốn kiểm soát tên tập tin, bạn sẽ có thêm một nội dung Tiêu đề -Disposition. Google có thể giúp bạn tìm đúng cách để sắp xếp.

+0

+1, mặc dù bạn đã thoát khỏi Nội dung-Bố trí, điều quan trọng nhất đối với việc tải xuống tệp. Chỉnh sửa: Và sau đó bạn thêm nó. Vì vậy, bỏ qua điều này. :) – Randolpho

0

Nó thực sự phụ thuộc vào giao diện cho dịch vụ web của bạn. Tức là SOAP, REST, ASPX.

Một điều bạn có thể thử là thay đổi loại nội dung trong Phản hồi của bạn thành "Ứng dụng/octet-stream". Hoặc một cái gì đó tương tự để nói với người nhận loại MIME.

Nếu bạn sử dụng WCF nghỉ ngơi, bạn có thể sử dụng Phát trực tiếp dưới dạng kiểu trả về trên dịch vụ web.

1

Một ý tưởng không tốt khi nhúng tệp vào dịch vụ web. Bạn chỉ cần thêm chi phí và phức tạp mà không có lợi ích thực sự.

Thay vào đó, bạn nên cung cấp IHttpHandler để xử lý việc tải lên tệp. Hầu hết các máy chủ web cũng cung cấp API trợ giúp để đơn giản hóa điều này, ví dụ: trong ASP.NET, bạn có thể truy cập các tập tin được tải lên với:

HttpContext.Request.Files [0]

Có rất nhiều tập tin javascript script upload đơn giản hóa này trên máy khách: http://www.phpletter.com/Demo/AjaxFileUpload-Demo/

+0

Tôi đang thực sự cố tải xuống tệp cho khách hàng, không tải lên máy chủ – user210757

+0

liên kết đó là spam hoặc mất ngữ cảnh kịp thời. – mcy

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