2012-01-11 45 views
5

Trong trường hợp này, tôi đã tạo một tệp nén chứa các tệp kết quả tìm kiếm và đang cố gửi tệp đó cho người dùng. Đây là đoạn mã tôi hiện đang cố gắng sử dụng.Làm cách nào để trả lại tệp zip cho trình duyệt thông qua phản hồi OutputStream?

File[] zippable = new File[files.size()]; 
File resultFile = ZipCreator.zip(files.toArray(zippable), results); 
InputStream result = new FileInputStream(resultFile); 
IOUtils.copy(result, response.getOutputStream()); 

Tuy nhiên, điều này hiện không hoạt động tốt. Thay vì trả lại tệp nén mà tôi đã tạo, nó trả về một tệp html. Nếu sau đó tôi tự thay đổi phần mở rộng của tệp, tôi có thể thấy rằng nội dung của tệp vẫn là kết quả tìm kiếm mà tôi cần. Vì vậy, vấn đề chỉ nằm trong việc trả về phần mở rộng thích hợp cho câu trả lời.

Có ai có lời khuyên nào cho tình huống này không?

Trả lời

6

Bạn cần đặt tiêu đề phản hồi Content-Type thành giá trị application/zip (hoặc application/octet-stream, tùy thuộc vào trình duyệt mục tiêu). Ngoài ra, bạn có thể muốn gửi thêm tiêu đề phản hồi cho biết trạng thái tệp đính kèm và tên tệp.

+0

Tôi nghĩ tôi có thể hiểu sai bạn ở đây. Tôi đã thêm một dòng vào mã, vì vậy bây giờ nó đọc 'response.setHeader (" Content-Type "," application/zip ");' Vẫn không thành công. Cuộc gọi này đang được thực hiện ngay trước khi cuộc gọi đến IOUtils.copy – Bennie

+0

@Bennie: có vẻ tốt, nhưng một lần nữa, có một số nhầm lẫn về loại "đúng" MIME để sử dụng cho tệp ZIP, vì vậy bạn có thể muốn chơi với các giá trị đó . – maerics

+0

Được rồi, có vẻ như nó hiện đang hoạt động, ít nhất là để trả lại tệp. Nó đang làm một điều kỳ lạ mặc dù, nơi tập tin được gọi là "exportZipSearchResults.htm.zip". Có cách tích hợp để thay đổi tên tệp trên phản hồi không? – Bennie

1

Bạn cần đặt tiêu đề loại nội dung thành application/octet-stream trước khi phát trực tuyến kết quả. Phụ thuộc vào những gì thực hiện của response bạn đang sử dụng về cách bạn thực sự làm điều này.

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