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
Trả lời
Đầ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();
Cẩn thận với phản hồi.End() http://stackoverflow.com/questions/1087777/is-response-end-considered-harmful –
@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
Tôi có nên sử dụng Response.Close() thay vì Repsonse.End() sau đó không? – user210757
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.
+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
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.
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/
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
liên kết đó là spam hoặc mất ngữ cảnh kịp thời. – mcy
- 1. Cách tải xuống tệp zip từ trang web (trăn)
- 2. Tải xuống applet java từ trang web
- 3. Tải xuống hình ảnh từ trang web trong .NET/C#
- 4. Tải xuống mã nguồn từ trang web của Apple
- 5. Không thể tải xuống JD-Eclipse từ trang web? Bất kỳ nguồn tải xuống nào khác?
- 6. Tại sao các tệp .docx bị hỏng khi tải xuống từ trang ASP.NET?
- 7. Cách đăng nhập và sau đó tải xuống tệp từ các trang web aspx có R
- 8. Android - cách tải xuống tệp từ máy chủ web
- 9. Tải xuống tất cả các tệp .tar.gz từ trang web/thư mục sử dụng WGET
- 10. Optimize tải một file XAP với một trang web asp.net
- 11. Tải xuống ASP.Net
- 12. ASP.NET MVC EPPlus Tải xuống Tệp Excel
- 13. Làm cách nào để tạo một lớp C# có thể tải xuống từ bên trong trang web ASP.NET MVC?
- 14. tải hình ảnh từ android lên webservice
- 15. Tải xuống tệp EXCEL từ trang ASP.NET mà không cần tạo tệp vật lý trên máy chủ (On The Fly)
- 16. Tải xuống tệp từ DataURL trong JavaScript
- 17. Nhận tên trang web IIS từ một trang web ASP.NET
- 18. Tạo trang tải xuống trong ColdFusion 8
- 19. Tải xuống tệp 'Mô phỏng' trong ứng dụng web HTML5
- 20. Cách thực hiện tải xuống tệp trong ASP.NET AJAX
- 21. Tải xuống một trang web và tất cả các tệp tài nguyên trong Python
- 22. Không thể tải xuống [tệp] từ [máy chủ] Không thể mở trang web Internet này. Trang web được yêu cầu hoặc không khả dụng
- 23. .htaccess, từ chối tải xuống tệp trong thư mục
- 24. tải xuống tệp trong các dịch vụ web an toàn
- 25. Tải xuống tệp bên trong WebView
- 26. Perl CGI để tải xuống tệp qua trình duyệt web
- 27. Python, nhiều chủ đề, tìm nạp trang web, tải xuống các trang web
- 28. Mã C# nhanh nhất để tải xuống trang web
- 29. Tải xuống hàng loạt các trang web C#
- 30. Nhúng PDF trên trang web và ngăn tải xuống
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