2011-01-12 33 views
15

Nếu tôi có tệp được cung cấp cho trình duyệt thông qua webapp của mình, tôi thường chỉ đặt URL thành một cái gì đó như http://website.com/webapp/download/89347/image.jpg. Sau đó tôi đặt tiêu đề HTTP Content-Type: application/octet-stream; filename=image.jpgContent-Disposition: Attachment.Tránh các vấn đề về loại nội dung khi tải xuống tệp qua trình duyệt trên Android

Tuy nhiên, trên Android. Có vẻ như cách duy nhất tôi có thể tải tệp xuống là đặt Content-Type: image/jpg. Nếu tên tập tin nói <Unknown> và một lỗi đến

Tải về thất bại
Không thể tải. Nội dung không được hỗ trợ trên điện thoại này

Có cách nào để Android tải xuống và mở tệp thông qua trình duyệt mà không lưu danh sách loại mime không?

+0

Xin chào George, tôi đang sử dụng kỹ thuật tương tự để tạo ra một liên kết tải về nhưng tôi đã không nhận được như thế nào chúng ta có thể thiết lập "tiêu đề HTTP" khi chuẩn bị một liên kết downlink cho một neo nhãn? bạn có thể giải thích thêm về điều này không? – nrsharma

+0

Đặt tiêu đề HTTP được thực hiện phía máy chủ trên máy chủ web, thường sử dụng ngôn ngữ lập trình như PHP, Java, CGI, v.v. Bạn đang phân phối tệp của mình như thế nào để tải xuống? –

+0

Xin lưu ý đây là một bài đăng cũ hơn đề cập đến một số phiên bản Android cũ hơn và có thể có thông tin lỗi thời. Nội dung-Bố trí thường được sử dụng để cho biết tải xuống được yêu cầu, thay vì chỉ 'xem'. –

Trả lời

24

Để thực hiện bất kỳ tải làm việc trên tất cả (và đặc biệt là tuổi trở lên) phiên bản Android như mong đợi, bạn cần phải ...

  1. thiết lập ContentType để application/octet-stream
  2. đặt Content-Disposition giá trị filename trong dấu ngoặc kép
  3. viết phần mở rộng tên file Content-Disposition trong chữ hoa

đã đọc bài viết trên blog của tôi để biết thêm chi tiết:
http://digiblog.de/2011/04/19/android-and-the-download-file-headers/

+0

xem StevePayne trả lời nếu bạn đang gặp phải thiết bị tải xuống trang html thay vì tệp chính xác. Tôi đã giải quyết vấn đề này bằng cách thay đổi POST của tôi thành GET. – nidal

+0

hI, Nếu tôi tải xuống hình ảnh từ downloadmanager thì một lần nữa nó không phải là mở với lỗi không thể mở tập tin. Tôi đã đặt mimitype yêu cầu thành jpg. những gì khác tôi phải làm –

+0

* Android 4, Ice Cream Sandwich *. Ví dụ: 'Content-Disposition: attachment; filename = "MyFileName.ZIP"; 'sẽ không hoạt động chính xác vì dấu chấm phẩy ở cuối. Bất kỳ thử nghiệm nào (và _summary_) cho tất cả các phiên bản Android? Hữu ích: http://stackoverflow.com/questions/6319389/streaming-mime-type-application-pdf-from-asp-app-fails-in-google-chrome 'Bản phát hành Google Chrome v12 đã giới thiệu một lỗi kích hoạt sự cố bạn miêu tả. Bạn có thể sửa lỗi bằng cách gửi tiêu đề Content-Length' https://bugs.chromium.org/p/chromium/issues/detail?id=85549 – Kiquenet

0

Tôi đã thử tất cả các đề xuất từ ​​blog của Jspy và không có gì hoạt động cho đến thời điểm này. Bố cục nội dung đưa trình duyệt ở chế độ tải xuống, tuy nhiên không có nội dung nào được tải xuống ngoại trừ HTML của trang mà từ đó tải xuống đã bắt đầu. Vì vậy, kết luận của tôi, đó là lỗi thuần túy từ Google và chúng tôi chỉ có thể cầu nguyện cho rằng Google sửa chữa nó. Công việc của tôi xung quanh là đặt loại nội dung cho một số loại đến từ trình duyệt di động chấp nhận mẫu tiêu đề. Nó thường hoạt động, thậm chí bạn có thể tải xuống các tệp zip dưới dạng văn bản.

+4

Dmitriy, nếu Android của bạn tải xuống mã HTML của trang nguồn (!) Của bạn, thì chắc chắn có điều gì đó sai trái với logic tập lệnh máy chủ của bạn.Nếu tải xuống không thành công trên Android thì sẽ không có khả năng để có HTML nguồn trong một tệp - thường bạn sẽ nhận được nội dung tải xuống nhưng không được ghi vào tệp hoặc thông báo lỗi chung. Nhưng HTML nguồn không có sẵn tại thời điểm đó. Hãy suy nghĩ về nó. – Jpsy

10

Dmitriy (hoặc những người khác tìm kiếm một giải pháp có thể) nếu một trang html xuất hiện trong tệp đã tải xuống của bạn, tôi nghi ngờ điều này là do vấn đề GET HttpRequest kép. Một kịch bản điển hình là sau POST, Redirect, GET mô hình:

  • trình duyệt Android đưa ra một HttpRequest POST đến máy chủ (ví dụ như nút hoặc liên kết trình yêu cầu một tập tin tải về, filename.ext nói)

  • Máy chủ truyền tệp yêu cầu filename.ext tới byte, lưu trữ trong biến phiên, sau đó phát hành Response.Redirect đến Download.aspx, ví dụ, để xử lý việc xây dựng đối tượng phản hồi

  • Trình duyệt Android gửi đúng HttpRequest GET tới máy chủ cho Download.aspx

  • Máy chủ phản hồi với Nội dung điển hình: Bố trí; filename = "filename.ext" tạo kiểu với đối tượng phản hồi chứa filename.ext được yêu cầu, là các byte trong biến phiên.

  • Trình quản lý tải xuống Android, tôi tin, sau đó gửi một HttpRequest GET khác đến máy chủ cho Download.aspx. Tôi nghi ngờ rằng trình quản lý tải xuống diễn giải phản hồi "tệp đính kèm" trước đó làm trình kích hoạt để gửi lần truy cập thứ hai này.

  • Máy chủ (Download.aspx) lại cố gắng xây dựng đối tượng phản hồi để gửi lại trình duyệt.

  • Tải xuống trình quản lý tải xuống Android filename.ext, sử dụng nội dung đối tượng phản hồi từ tệp Download.aspx thứ hai.

Trong nhiều trường hợp, điều này sẽ ổn. Nhưng nếu, ví dụ, máy chủ trong mã Download.aspx làm một số vệ sinh và loại bỏ biến phiên lần đầu tiên nó được gọi, sau đó thời gian tiếp theo xung quanh không có biến phiên. Vì vậy, tùy thuộc vào cách mã được viết nó có thể là đối tượng phản ứng không nhận được explicity xây dựng và có thể là Response.End không nhận được gọi là và do đó chỉ có Download.aspx của html kết thúc được gửi.

Đây là những gì chúng tôi đã phát hiện bằng Wireshark, mặc dù tôi thừa nhận rằng tôi cho rằng đó là trình quản lý tải xuống Android là nguyên nhân của GET kép.

Tôi hy vọng giải thích này đã được một số trợ giúp.

+3

Steve, lời giải thích của bạn phù hợp rất nhiều với các quan sát của những người bình luận bài đăng trên blog của tôi (được đề cập trong câu trả lời của tôi ở trên). Đây là một vấn đề mà dường như xảy ra ngay cả với các phiên bản Android cao hơn (ít nhất lên đến 3.2.1) và dường như phụ thuộc vào trình duyệt đang sử dụng (Dolphin & Android bị ảnh hưởng, FF và Opera không bị ảnh hưởng). Một giải pháp có thể là thay thế yêu cầu đầu tiên bằng GET hoặc mã hóa (nếu có thể) tất cả dữ liệu cần thiết vào URL của yêu cầu tải xuống. Chúc mừng, Jörg. – Jpsy

+1

Tôi đã tìm thấy vấn đề [1780] (http://code.google.com/p/android/issues/detail?id=1780) và [3948] (http://code.google.com/p/android/issues/detail? id = 3948) trong diễn đàn Android, mô tả sự không có khả năng của trình duyệt chứng khoán và trình quản lý tải xuống Android để xử lý chính xác các lượt tải xuống được bắt đầu thông qua các yêu cầu POST. Cả hai báo cáo đã được công nhận bởi người kiểm duyệt diễn đàn, nhưng được gắn nhãn là "cải tiến" thay vì là lỗi. 1780 là trên 3 tuổi, được đánh dấu bởi +100 khách truy cập và vẫn không có dấu hiệu cho thấy nó đã được giải quyết, thậm chí không có trong phiên bản Android mới nhất (4.0.4 tại thời điểm này). – Jpsy

+0

ai đó đã tìm giải pháp? nó vẫn là vấn đề hợp lệ. Tôi nhận được hai yêu cầu trên máy chủ trong khi tải xuống. Có thể tìm ra yêu cầu nào là giả không? – Diyko

0

Về lý thuyết, thông số tên tệp phải được đặt trên Nội dung bố trí, không phải Content-Type. Bạn không chắc chắn liệu điều này có giúp ích gì với trình duyệt Android hay không.

2

Như tôi đã viết tại downloading files from android:

Trình duyệt Android sẽ không tải xuống tệp trong nút Sự kiện đăng. Trong các sự kiện sau, tệp sẽ là một số tệp tin .htm. để đến đây làm như sau.

Trong nút tải về nhấp

protected void ImageButton1_Click(object sender, ImageClickEventArgs e) 
    { 
     Response.Redirect("download-file.aspx"); 
    } 

and on download-file.aspx file do as below 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class mobile_download_file : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     string filename = "usermanual.pdf"; 
     Response.ContentType = "application/octet-stream"; 
     Response.AppendHeader("Content-Disposition", "attachment; filename=" + "" + filename + ""); 
     Response.Write(Server.MapPath(Request.ApplicationPath) + "\\" + filename); 
     Response.TransmitFile(Server.MapPath(Request.ApplicationPath) + "\\" + filename); 
     Response.End(); 
    } 
} 

the same can be implemented in php also. 
+0

Xin chào Martin, và chào mừng bạn đến với StackOverflow. 1. Tôi không nghĩ rằng các yêu cầu POST là một phần của câu hỏi, nhưng điều đó không quan trọng và có thể câu trả lời của bạn là hữu ích đối với một số người. 2. Tôi nghĩ rằng mẫu mã không có liên quan ở đây. ** Tôi không sử dụng php hoặc aspx. **. 3. ** Tôi khuyên bạn nên ** chỉnh sửa thay thế mẫu mã bằng văn bản như "bạn sẽ cần phải tạo chuyển hướng làm phản hồi cho POST, sau đó tải tệp xuống từ URL bạn đã chuyển hướng đến". Những người tìm kiếm các mẫu mã nên đăng câu hỏi cho ngôn ngữ của họ. –

+0

Bạn đã thử nghiệm tính năng *** Android *** _versions_ nào? – Kiquenet

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