2012-07-18 32 views
5

Tôi đang cố tạo động PDF nội tuyến, khi người dùng chọn lưu tệp, hãy nhắc bằng tên tệp tùy chỉnh của tôi. Theo số the documentation, thuộc tính saveasname sẽ làm những gì tôi muốn.Bố cục nội dung bị bỏ qua trong IE 9 và Firefox 13

(định dạng = "PDF" chỉ) Tên tệp xuất hiện trong hộp thoại Lưu khi người dùng lưu tệp PDF được ghi vào trình duyệt.

Tuy nhiên, điều xảy ra trong cả IE 9 và Firefox 13.0.1 là tên tệp xuất hiện trong hộp thoại SaveAs giống với mẫu CF của tôi, nhưng có phần mở rộng PDF. (Nói cách khác, mã của tôi là ở makepdf.cfm và SaveAs nhắc tôi lưu makepdf.pdf.) Trong Chrome, tuy nhiên, mã hoạt động hoàn hảo. (Tất cả trên Windows 7.)

Đây là mã của tôi để tạo PDF:

<cfdocument format="pdf" bookmark="true" saveasname="MyReport.pdf"> 

Nếu tôi tuyên bố một cách rõ ràng việc xử lý nội dung và kiểu nội dung, như vậy

<cfheader name="Content-Disposition" value="inline; filename=MyReport.pdf"> 
<cfcontent type="application/x-pdf"> 
<cfdocument format="pdf" bookmark="true" saveasname="MyReport.pdf"> 
  • Chrome cho tôi biết rằng "Nội dung Bố trí" đã được khai báo hai lần
  • Firefox cho tôi biết tệp PDF bị hỏng
  • IE chỉ cần bỏ qua nó (và vẫn không hiển thị tên tập tin ngay)

Nếu tôi chỉ dựa vào tiêu đề

<cfheader name="Content-Disposition" value="inline; filename=MyReport.pdf"> 
<cfcontent type="application/x-pdf"> 
<cfdocument format="pdf" bookmark="true"> 

tôi nhận được hành vi tương tự như trong đoạn đầu tiên của mã.

Tôi biết cách để trình duyệt nhắc tải xuống thay vì hiển thị nội tuyến và mọi thứ hoạt động như mong đợi, nhưng đó không phải là hành vi mong muốn.

Tôi cần sử dụng thời gian và ngày trong tên tệp và người dùng cuối không đủ hiểu biết để không ghi đè tệp của họ (nếu họ chọn lưu chúng).

Có điều gì tôi thiếu mà sẽ khiến IE và Firefox thực hiện những gì họ phải làm không? Những trình duyệt nào khác sẽ làm điều này? Safari di động?

Trả lời

2

Vấn đề dường như là "filename = xxx" đã thực sự dành cho các "đính kèm" bố trí, và không phải tất cả các plugin trình duyệt PDF nhận nó như là một cơ chế để chỉ định nội tuyến "lưu dưới dạng", như bạn đã khám phá.

Một cách tiếp cận khác để sử dụng tên tệp ưa thích của bạn là thao tác URL bằng quy tắc ghi đè máy chủ web. Như một ví dụ đơn giản, bạn sẽ có kịch bản của bạn để tạo các tệp pdf và cung cấp chúng trực tuyến: pdf.cfm

<cfheader name="Content-Disposition" value="inline"> 
<cfdocument format="PDF" mimetype="application/pdf">Test</cfdocument> 

Sau đó tạo một quy tắc viết lại mà phù hợp với URL dưới dạng /pdf/mYfiLEname và vượt qua họ để pdf.cfm. Trên IIS7, điều này có thể là:

<rule name="Inline PDF SaveAs" stopProcessing="true"> 
    <match url="^/pdf/[\w-]+$" ignoreCase="true" /> 
    <action type="Rewrite" url="/pdf.cfm" appendQueryString="false" /> 
</rule> 

Điều này sẽ khớp với tên tệp chỉ chứa ký tự chữ và số, dấu gạch dưới và gạch nối. Bạn sẽ không muốn cho phép dấu cách hoặc các ký tự tên tệp không hợp lệ.

Khi bạn truy cập /pdf/MyReport PDF sẽ được hiển thị inline bởi các plugin, và khi bạn lưu nó, tên tập tin mặc định sẽ myreport.pdf.

Nếu bạn đang sử dụng một khung công cụ hỗ trợ URL an toàn cho công cụ tìm kiếm hoặc "tuyến đường", bạn có thể thực hiện tương tự mà không cần phải viết lại máy chủ web.

CẬP NHẬT: Trên thực tế, bạn không cần sử dụng viết lại URL: chỉ cần thêm dấu gạch chéo và sau đó là tên tệp mong muốn vào URL tập lệnh CF, ví dụ:

/pdf.cfm/myreport

Plugin sẽ sử dụng bất cứ điều gì xảy ra sau khi các dấu gạch chéo thức là "Save As ..." tên.

+0

URL viết lại không phải là một lựa chọn cho dự án đặc biệt này, nhưng đây là một số thông tin tốt để có cho tương lai. – ale

+0

Hóa ra bạn không cần viết lại URL - chỉ cần thêm một dấu gạch chéo và tên tệp bạn đã chọn vào URL tập lệnh là đủ. Xem câu trả lời được cập nhật. – CfSimplicity

-1

Tôi sẽ sử dụng thuộc tính name của thẻ cfdocument sẽ lưu trữ nội dung trong một biến. Sau đó, sử dụng các thẻ cfheadercfcontent như bạn đã nêu ở trên, ngoại trừ việc thay thế "nội dòng"; cùng với tập đính kèm;"

tôi sử dụng mã như thế này:

<cfdocument name="pdf"> ... </cfdocument> 
<cfheader name="Content-Disposition" value="attachment;filename=MyReport.pdf;" /> 
<cfcontent type="application/pdf" variable="#pdf#" /> 
3

Đảm bảo bạn sử dụng ATTACHMENT chứ không phải INLINE.

IE KHÔNG thích INLINE và sẽ mở một tài liệu word như READ ONLY cũng như không giả sử tên tệp bạn cung cấp.

Ví dụ:

<cfheader name="content-disposition" value="attachment; filename=#filename#.doc" charset="utf-8"> 

KHÔNG

<cfheader name="content-disposition" value="inline; filename=#filename#.doc" charset="utf-8"> 
Các vấn đề liên quan