2011-01-28 34 views
5

Tôi có một ứng dụng web Java đang tạo bản pdf và phát trực tuyến trở lại trình duyệt.Đặt tên tệp của Pdf được phát trực tiếp trở lại trình duyệt

byte[] pdf = report.exportPdfToArray(user); 
response.setContentType("application/pdf"); 
response.setHeader("content-disposition", "inline; filename=\"My.pdf\""); 
outStream = response.getOutputStream(); 
outStream.write(pdf); 
outStream.flush(); 
outStream.close(); 

Báo cáo được thực thi và được gửi lại trình duyệt nhưng tôi không thể kiểm soát tên tệp mặc dù tôi đã đặt content-disposition. Tôi đang sử dụng Jboss 4.2.1. Bạn có biết tôi đang thiếu gì không?

EDIT: Vậy có cách nào để đặt tên tệp khi bố cục nội dung không?

+1

Một số trình duyệt, cụ thể là IE6, thỉnh thoảng hành động vui nhộn. Tôi đã phải thêm một cái gì đó như? F =/myfile.pdf ở cuối chuỗi truy vấn để làm cho nó hoạt động trong IE6. – Spliffster

Trả lời

8

nội dung-bố trí: tệp đính kèm ....

+0

Nhưng tôi không muốn tải xuống tệp. Tôi muốn hiển thị nó trong trình duyệt. – Atticus

+0

@Atticus: Tôi phải xác nhận rằng tôi có cùng một vấn đề, thêm nó không hoạt động với inline 'inline' (IE và Firefox) – Ralph

+0

pdf nhận được tên của servlet. Có thể có khả năng đặt tiêu đề của trang (trong đó pdf được hiển thị) không? – Atticus

1

Tôi không thể phát hiện lỗ hổng. Bạn đã kiểm tra hành vi với các trình duyệt/trình đọc khác chưa?

Tính đến RFC, nó không phải là định nghĩa những gì khách hàng phải làm gì với những thông tin filename nếu hiển thị nội tuyến ...

+0

Thậm chí còn tồi tệ hơn, RFC: Người gửi có thể muốn đề xuất tên tệp sẽ được sử dụng nếu thực thể là tách ra và được lưu trữ trong một tệp riêng biệt. Nếu MUA nhận ghi thực thể vào một tệp, tên tệp được đề xuất sẽ được sử dụng làm cơ sở cho tên tệp thực tế, nếu có thể. Điều quan trọng là MUA nhận không mù quáng sử dụng tên tệp được đề xuất . Tên tệp được đề xuất NÊN được kiểm tra (và có thể là thay đổi) để thấy rằng nó tuân theo quy ước hệ thống tệp cục bộ, không ghi đè tệp hiện có và không trình bày vấn đề an ninh ... – Ralph

+1

hiện có lỗ hổng trong việc triển khai ở trên nhưng trong các phiên bản IE khác nhau và cách IE hoặc plugin acrobat xử lý các tiêu đề phản hồi HTTP. Tôi chưa gặp sự cố với các trình duyệt khác. – Spliffster

-2

Có workaround để làm như vậy. Chúng tôi có thể sử dụng iframe nơi iframe sẽ mở trong trang html, iframe sẽ giữ báo cáo pdf trong khi trang html độc lập với iframe. Chúng tôi có thể chỉnh sửa tiêu đề của trang html chứa khung nội tuyến.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> 
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<html> 
    <head> 
     <title>${reportName}</title> 
    </head> 
    <body> 
     <iframe src="/fcWeb/ReportPDFServlet" width="100%" height="100%"></iframe> 
    </body> 
</html> 
+0

Có điều gì đó không hoàn toàn viết về việc đánh dấu mã của bạn ở đây. Hãy xem [tại hướng dẫn này] (http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks) và sau đó chỉnh sửa câu trả lời của bạn để sửa chữa nó có lẽ? – Flexo

3

MSIE sẽ sử dụng phần cuối của thông tin đường dẫn của URL yêu cầu (phần phía sau cuối cùng /) như tên tập tin mặc định của Save As hành động. Nó bỏ qua các thuộc tính filename của tiêu đề Content-Disposition hoàn toàn. Tất cả các trình duyệt khác đều xử lý tiêu đề đó đúng cách.

Bạn cần thay đổi mẫu URL của servlet PDF của bạn thành ánh xạ đường dẫn. I E. không sử dụng /pdf với http://example.com/context/pdf, nhưng thay vì sử dụng /pdf/* với http://example.com/context/pdf/report.pdf. Bằng cách này, MSIE sẽ sử dụng "report.pdf" thay vì "pdf" làm tên tệp mặc định cho hành động Lưu dưới dạng.

2

Tôi đã thử một giải pháp trong java và nó hoạt động.

response.setHeader("Content-Disposition","inline; filename=\"MyFile.pdf\""); 
response.setContentType("application/pdf; name=\"MyFile.pdf\""); 
response.getOutputStream().write(pdfAsBytesArray); 
0

Đó là lạ, nhưng nó có thể có ích cho một ai đó (có thể ai đó có thể cho biết những gì là sai với nó):

Khi tôi đặt hai tiêu đề như:

response.addHeader("content-length", String.valueOf(((FileInputStream) is).getChannel().size())); 
response.addHeader("Content-disposition", "attachment; filename=\"MyFileName.doc\""); 

Nó không công việc. Nhưng khi tôi thay đổi thứ tự nó hoạt động như mong đợi:

response.addHeader("Content-disposition", "attachment; filename=\"MyFileName.doc\""); 
response.addHeader("content-length", String.valueOf(((FileInputStream) is).getChannel().size())); 
Các vấn đề liên quan