2012-12-08 43 views
5

Tôi đang cố gắng tải tệp xuống từ máy chủ web và lưu tệp đó dưới tên tệp gốc mà máy chủ đang gửi cùng với tệp. Tải xuống hoạt động rất tốt, nhưng tôi không thể lấy tên tệp thực.Lấy tên tệp từ tệp tải xuống http

Ví dụ thực tế Tôi đang cố tải xuống this file (Trình đọc PDF của Foxit).

Nếu tôi đang sử dụng liên kết này trong trình duyệt như Chrome, trình duyệt tải xuống tệp có tên chính xác kể cả phiên bản, v.v. Tôi lấy tên này từ đâu? Tôi đã thử đọc thông tin tiêu đề và đang tìm kiếm Content-Disposition nhưng máy chủ không gửi thông tin này. Tôi lấy tên chính xác từ đâu?

tôi đã cố gắng một cái gì đó như thế này:

try {    
    URL webfile = new URL("http://www.foxitsoftware.com/downloads/latest.php?product=Foxit-Reader"); 
    URLConnection con = webfile.openConnection(); 
    Map map = con.getHeaderFields(); 
    Set set = map.entrySet(); 
    Iterator iterator = set.iterator(); 
    while (iterator.hasNext()) { 
     System.out.println(iterator.next()); 
    } 
} catch (IOException ex) { 
    System.out.println("Error: "+ex.getMessage()); 
} 

Như bạn có thể nhìn thấy trong đầu ra không có Content-Disposition:

null=[HTTP/1.1 200 OK] 
ETag=["244005-f36d40-4d003f3868000"] 
Date=[Sat, 08 Dec 2012 12:29:02 GMT] 
Content-Length=[15953216] 
Last-Modified=[Tue, 04 Dec 2012 10:01:36 GMT] 
Content-Type=[application/x-msdos-program] 
Connection=[close] 
Accept-Ranges=[bytes] 
Server=[Apache/2.2.16 (Debian)] 

Vậy làm thế nào tôi có thể lấy lại tên tập tin chính xác? Liên kết trong trình duyệt tải xuống tệp có tên FoxitReader544.11281_enu_Setup.exe.

Bất kỳ ý tưởng nào ?!

Trả lời

3
GET /downloads/latest.php?product=Foxit-Reader HTTP/1.1 

đưa ra một phản ứng của HTTP/1.1 302 Found

và đặt tiêu đề phản ứng

Location: http://cdn04.foxitsoftware.com/pub/foxit/reader/desktop/win/5.x/5.4/enu/FoxitReader544.11281_enu_Setup.exe 

và cuối cùng, bạn hành,

GET /pub/foxit/reader/desktop/win/5.x/5.4/enu/FoxitReader544.11281_enu_Setup.exe HTTP/1.1 

Đó là nơi mà các tên tập tin có vẻ là đến từ. Vì vậy, nếu chuyển hướng đang diễn ra một cách minh bạch, bạn vẫn có thể lấy tên tệp từ thông số yêu cầu.

+0

Wow! Tôi đoán GET là Ok vì thông tin 'HTTP/1.1 200 OK' ?! Tại sao tôi nhận được 200 nếu tôi nhận được 302? – Marco

+3

Nó tự động chuyển hướng, nếu tham số được đặt. Xem [** 'getFollowRedirects()' **] (http://docs.oracle.com/javase/1.5.0/docs/api/java/net/HttpURLConnection.html#getFollowRedirects()) và [** ' setFollowRedirects() '**] (http://docs.oracle.com/javase/1.5.0/docs/api/java/net/HttpURLConnection.html#setFollowRedirects (boolean)) –

+0

Tốt đẹp! Cảm ơn nhiều! Cần đợi thêm 2 phút nữa để chấp nhận ...;) – Marco

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