2012-02-06 19 views
8

Tôi gặp sự cố với tên tệp đính kèm. Khi tôi gọi trang web trên google chrome, nó sẽ trả về tệp có tên và phần mở rộng phù hợp. Tôi đã thử nghiệm nó với internet explorer và nó hoạt động tốt quá. Vấn đề nằm chỉ với Firefox. Tôi gọi trang web và nó trả về từ đầu tiên trên tiêu đề tệp và không có phần mở rộng.Đầu đề Firefox và Content-Disposition

Ví dụ: nếu tôi muốn một tệp có tên "Báo cáo của tôi.docx", tệp này sẽ chuyển một tệp có tên là "Của tôi". Tôi đã đi khắp nơi và hóa ra đây là vấn đề thường gặp với mọi người bởi vì các trình duyệt đọc các tiêu đề khác nhau. Họ nói rằng việc sửa chữa là trích dẫn tên file:

Content-Disposition: attachment; filename=My Report.docx

bây giờ là: (lưu ý có dấu ngoặc kép)

Content-Disposition: attachment; filename="My Report.docx"

Tuy nhiên, điều đó không làm việc cho tôi.

Trên chrome, nó trả về "My Report.docx" (thực sự có dấu ngoặc kép). Firefox trả lại một tệp lẻ có đuôi mở rộng và tên thích hợp và không có dấu ngoặc kép nào nhưng nó không thể được thực thi. Đó là kích thước tệp thích hợp, phần mở rộng thích hợp và tên thích hợp nhưng nó không thể được thực thi. Ngoài ra nó trả về một dấu cách trước và sau tên tệp.

+3

có thể trùng lặp của [Cách mã hóa tham số tên tệp của tiêu đề Nội dung-Bố trí trong HTTP?] (Http://stackoverflow.com/questions/93551/how-to-encode-the-filename-parameter-of-content -disposition-header-in-http) –

+1

Nếu bạn tự hỏi tại sao Firefox của bạn bỏ qua tiêu đề này, hãy kiểm tra xem bạn đã cài đặt addon 'InlineDisposition' chưa: nó là một addon tuyệt vời được viết đặc biệt để vô hiệu hóa' Content-Disposition' buộc tải xuống và rất dễ quên khi phát triển web. –

+2

Dấu ngoặc kép làm việc trong IE, Chrome và FireFox cho tôi, sử dụng các phiên bản mới nhất. – angularsen

Trả lời

4

này nên làm việc như mong đợi, đây là một SOq với cùng một vấn đề:

và cũng là trang Mozilla (Tôi đoán bạn đã được tham khảo cái này):

Tôi không biết chi tiết cụ thể của mã phía máy chủ của bạn, nhưng đây là một số điều cần xác nhận/thử:

  • Nếu bạn có PHP có sẵn tại máy chủ, bạn có thể thử các mã từ liên kết đầu tiên ở trên ? Nếu không, bạn có thể tìm thấy một thứ gì đó trên Net bằng ngôn ngữ bạn chọn. Bằng cách đó, bạn có thể xác nhận xem sự cố có nằm trong mã của bạn hay ở nơi khác (thiết lập máy chủ, trình duyệt, v.v.)
  • Điều này có xảy ra với các máy khách khác (tức là bạn thử tải xuống) hay chỉ trên máy đó không? Bạn có thể muốn thử người khác xác nhận.
  • Tính năng này có hoạt động tốt trong IE/Safari hoặc một số trình duyệt khác không? Bạn thậm chí có thể thử làm điều đó với wget hoặc curl từ dòng lệnh hoặc điều gì đó tương tự.
  • Bạn cũng có cung cấp tiêu đề Content-Type chính xác không?
  • Bạn có thể thử tải xuống một số tệp khác hoặc tệp thuộc loại khác không, ví dụ: a .png hoặc .xls? Trong thực tế, có lẽ dễ nhất là thử một tập tin văn bản thuần túy (text/plain) và sau đó lấy nó từ đó.

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn bạn đã trả lời, nhưng liên kết đầu tiên đó là những gì tôi đang làm trong mã php. Và có đó là điều tôi đang đề cập quá. Tôi đã cố gắng làm những gì nó nói bằng cách trích dẫn nó nhưng tất cả những gì nó làm là đặt thêm khoảng trống ở phía trước và kết thúc vào tên tệp sao cho nó giống như "My report.docx" và đó là lý do tại sao nó không thể được thực thi . Tôi đã thử sử dụng str_replace() nhưng điều đó không hoạt động. Tôi đã thử mọi thứ. Tôi có thể làm cho nó hoạt động cho một trình duyệt nhưng nó lại phá vỡ một trình duyệt khác ... hầu như không thể tìm được số dư ... Tôi cũng không cung cấp tiêu đề Content-Type –

+0

Được rồi vì vậy tôi đã tìm ra nó sử dụng với tất cả sự đau buồn chết tiệt. Đó là bởi vì tôi đang sử dụng một biến như một cái tên. Mã của tôi được viết: $ name2 = "filename =". "$ Name"; tiêu đề ('Nội dung-Bố trí: tệp đính kèm;'. $ Name2); Nó xử lý giá trị "$" trong biến là không gian khi máy chủ xử lý. Tôi đã tìm ra cách để vượt qua điều đó .... Tôi không có ý tưởng nếu điều đó thậm chí có thể -.- –

+0

Mát mẻ, vui mừng vì đã làm việc cho bạn! –

4

Tôi biết đây là câu hỏi rất cũ, nhưng gần đây tôi có cùng một vấn đề.Giải pháp là một trong hai

  1. Mã hóa tên tập tin của bạn mỗi RFC2184 hay,
  2. Nếu bạn không có ký tự đặc biệt trong tên tập tin của bạn, trích dẫn nó trong chuỗi nội dung bố trí.

Vì bạn đã thử 2, bạn có thể thử sử dụng 1 và xem cách hoạt động.

Thông thường tôi sử dụng lớp ContentDisposition để tạo tiêu đề của tôi cho tôi:

Dim contentDispositionHeader = New Net.Mime.ContentDisposition() With {.FileName = filename} 
Response.AddHeader("Content-Disposition", contentDispositionHeader.ToString()) 

Hope this helps.

+1

Bạn muốn đọc RFC 5987 và RFC 6266. –

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