2013-04-08 34 views
7

Cách lấy tên tệp mà chúng tôi đã tải lên trên máy chủ khi chúng tôi cung cấp liên kết cho tệp đó trong trang?Cách lấy tên tệp khi nhấp vào URL trong chế độ xem web

Điều tôi đang làm là cung cấp dữ liệu có liên kết tệp trong chế độ xem web nên bất cứ khi nào người dùng nhấp vào liên kết cần tải xuống từ máy chủ vì tôi đã tải xuống tệp này từ máy chủ nhưng sự cố không thể nhận được loại chính xác và bằng cách sử dụng DownloadManager. Tôi muốn như

enter image description here

này Xem ở trên, chúng tôi đã đưa ra liên kết tới tệp của tôi trong test_androt và khi tôi nhấp vào nó sẽ cung cấp cho các dailog với tùy chọn có tên tập tin, tôi không biết làm thế nào để đạt được điều này tên tệp khi người dùng nhấp vào liên kết URL WebView.

Sửa Xin lỗi vì đã quên đề cập đến rằng URL của tôi trông như thế này

misc/dnload.php?t1=MzQ0MDA=&t2=MTY5NTUz&t3=MTY5NTUzMTMwMjEyMDNfcGhhcm1hY3kga2V5IGluZm8ucG5n&t4=MTMwMjEyMDM= 
+2

để bạn thực hiện một yêu cầu http để tải về các tập tin. Nếu vậy thì bạn có thể lấy tên tệp từ nội dung tiêu đề. – Raghunandan

Trả lời

9

Tôi nhận được câu trả lời nhờ Raghunandan đề xuất.

Ở đây tôi cần phải gọi thêm để nhận thông tin tiêu đề của tệp tải xuống. Trong phần tiêu đề, tôi đã nhận được tên của tập tin.

Tôi cũng tìm thấy bài đăng này Filename from URL not containing filename suffix thông qua đó tôi có thêm chi tiết về chi tiết tiêu đề mà chúng tôi có thể nhận được khi yêu cầu.

Như chúng ta có thể sử dụng URLUtil.guessFileName(url, null, null) này nhưng điều này sẽ được đặt tên tập tin gọi phương tiện đối với trường hợp của tôi, tôi có url như thế này

misc/dnload.php?t1=MzQ0MDA=&t2=MTY5NTUz&t3=MTY5NTUzMTMwMjEyMDNfcGhhcm1hY3kga2V5IGluZm8ucG5n&t4=MTMwMjEyMDM= 

như vậy từ liên kết ở trên này sẽ trích xuất các dnload.php như tên tệp không phải là tên tệp gốc mà chúng tôi tải xuống nó vừa tạo liên kết tải xuống cho tệp đó.

đây là mã sử dụng điều này chúng tôi có thể lấy tên tệp chỉ là một cuộc gọi bổ sung để nhận thông tin nhưng thực sự chúng tôi tải xuống, để tải xuống, tôi đã sử dụng api sẵn có android để DownloadManager tải xuống tệp.

Content-Disposition this is the attribute in header section through which we can get the file name as in attachment form. 

Nó sẽ sẽ trở lại thông tin như cách này Content-Disposition: attachment; filename="fname.ext" vì vậy bây giờ chỉ cần trích xuất tên file

class GetFileInfo extends AsyncTask<String, Integer, String> 
{ 
    protected String doInBackground(String... urls) 
    { 
       URL url; 
       String filename = null; 
       try { 
        url = new URL(urls[0]); 
       HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
       conn.connect(); 
       conn.setInstanceFollowRedirects(false); 

       String depo = conn.getHeaderField("Content-Disposition"); 
       String depoSplit[] = depo.split("filename="); 
       filename = depoSplit[1].replace("filename=", "").replace("\"", "").trim(); 
       } catch (MalformedURLException e1) { 
        e1.printStackTrace(); 
       } catch (IOException e) { 
       } 
      return filename; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(); 
     // use result as file name 
    } 
} 
+0

Xem xét ['setRequestMethod (" HEAD ")'] (http://developer.android.com/reference/java/net/HttpURLConnection.html#setRequestMethod (java.lang.String)) thay vì yêu cầu 'GET' từ bạn chỉ muốn các tiêu đề. Ngoài ra, đối với trường hợp tổng quát hơn, hãy nhớ rằng 'depo' có thể là null,' depo' có thể có mặt nhưng không có tên tệp hoặc tên tệp có thể do máy chủ mã hóa do [hành vi không chuẩn ở mọi nơi Internet Explorer] (http://stackoverflow.com/q/93551/687315). – user113215

+0

@Pratik: Tôi đã thử cách tiếp cận trên nhưng nó không hoạt động trong trường hợp của tôi. Bạn có thể giúp tôi liên quan đến truy vấn của tôi ở đây không: http://stackoverflow.com/questions/24577166/get-the-file-image-name-from-the-url-which-does-not-end-with-a- file-name-and-ext –

10

Bạn chỉ có thể phân tích url và nhận được văn bản sau khi người cuối cùng "/" và chắc rằng tên tập tin, hoặc bạn có thể sử dụng sau đây

URLUtil.guessFileName(url, contentDisposition, mimetype); 

hiển thị dưới đây như tôi đã sử dụng nó trong DownloadListener tôi:

//this stuff goes inside your DownloadListener 
@Override 
public void onDownloadStart(final String url, String userAgent,final String contentDisposition, final String mimetype, long contentLength) 
{ 
    String fileName = URLUtil.guessFileName(url, contentDisposition, mimetype); //returns a string of the name of the file THE IMPORTANT PART 

    //proceed with download 
} 

Nếu bạn không muốn sử dụng nó bên trong Trình tải xuống của mình, bạn có thể sử dụng nó mà không có contentDisposition hoặc mimetype bằng cách chỉ chuyển 'null' vào cho mỗi thông số ngoại trừ url (cũng chuyển url vào).

CHỈNH SỬA: Tính năng này chỉ hoạt động nếu bạn có url có tên tệp được nhúng trong đó. Xem câu trả lời của Pratik ở trên nếu bạn đang tìm kiếm một cách dễ dàng hơn.

0

Một số cải tiến cho giải pháp Pratik của.

Thay đổi:

1) cố định tên tập tin khai thác bị hỏng từ Content-Disposition

2) bổ sung giao diện callback

Cách sử dụng:

new GetFileInfo(new GetFileInfoListener() { 
    @Override 
    public void onTaskCompleted(String fileName) { 
     Log.v(TAG, "real filename is " + fileName); 
    } 
}).execute(url); 

Code:

class GetFileInfo extends AsyncTask<String, Integer, String> 
{ 
    public interface GetFileInfoListener { 
     void onTaskCompleted(String result); 
    } 

    private final GetFileInfoListener mListener; 

    public GetFileInfo(GetFileInfoListener listener) { 
     mListener = listener; 
    } 

    protected String doInBackground(String... urls) 
    { 
     URL url; 
     String filename = null; 
     try { 
      url = new URL(urls[0]); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      conn.connect(); 
      conn.setInstanceFollowRedirects(false); 

      String depo = conn.getHeaderField("Content-Disposition"); 

      if (depo != null) 
       filename = depo.replaceFirst("(?i)^.*filename=\"?([^\"]+)\"?.*$", "$1"); 
      else 
       filename = URLUtil.guessFileName(urls[0], null, null); 
     } catch (MalformedURLException e1) { 
      e1.printStackTrace(); 
     } catch (IOException e) { 
     } 
     return filename; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     if (mListener != null) 
      mListener.onTaskCompleted(result); 
    } 
} 
0

AsyncTask tự lấy tên tập tin:

private static class getFileNameAsync extends AsyncTask<String, Void, String> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     URL url; 
     String filename = null; 
     HttpURLConnection conn = null; 
     try { 
      url = new URL(params[0]); 
      conn = (HttpURLConnection) url.openConnection(); 
      conn.connect(); 
      conn.setInstanceFollowRedirects(false); 

      try { 
       for(int i = 0; i < 100; i++) 
       { 
        String stringURL = conn.getHeaderField("Location"); 
        if (stringURL != null) { 
         url = new URL(stringURL); 
         conn = (HttpURLConnection) url.openConnection(); 
         conn.connect(); 
         conn.setInstanceFollowRedirects(false); 
        } else { 
         i = 100; 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      String depo = conn.getHeaderField("Content-Disposition"); 
      if (depo != null) { 
       String depoSplit[] = depo.split(";"); 
       int size = depoSplit.length; 
       for(int i = 0; i < size; i++) 
       { 
        if(depoSplit[i].startsWith("filename=")) 
        { 
         filename = depoSplit[i].replaceFirst("(?i)^.*filename=\"?([^\"]+)\"?.*$", "$1").trim(); 
         i = size; 
        } 
       } 
      } 
     } catch (MalformedURLException e){ 
      e.printStackTrace(); 
     } catch (ProtocolException e){ 
      e.printStackTrace(); 
     } catch (FileNotFoundException e){ 
      e.printStackTrace(); 
     } catch (IOException e){ 
      e.printStackTrace(); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } finally { 
      if (conn != null) 
       conn.disconnect(); 
     } 
     return filename; 
    } 
    @Override 
    protected void onPostExecute(String filename) { 
     super.onPostExecute(filename); 
    } 
} 

Code:

String url = "Put your url hear"; 
    String fileName = ""; 
    url = url.replace(" ", "%20"); 

    AsyncTask<String, Void, String> asyncTask = new getFileNameAsync(); 
    asyncTask.execute(url); 

    try { 
     fileName = asyncTask.get(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     e.printStackTrace(); 
    } catch (CancellationException e) { 
     e.printStackTrace(); 
    } 
    if ((fileName == null) || (fileName.hashCode() == "".hashCode())) { 
     fileName = URLUtil.guessFileName(url, contentDisposition, mimetype); 
    } 
Các vấn đề liên quan