2013-04-08 17 views
7

Jak uzyskać nazwę pliku, który przesłaliśmy na serwer, gdy udostępniamy link dla tego pliku na stronie?Jak uzyskać nazwę pliku po kliknięciu adresu URL w widoku sieciowym

To, co robię, to udostępnianie danych za pomocą linku do pliku w widoku przeglądarki, więc za każdym razem, gdy użytkownik kliknie łącze, musi pobrać z serwera, ponieważ pobrałem ten plik z serwera, ale problem nie jest w stanie uzyskać jego dokładnego typu i nazwa za pomocą DownloadManager. Chcę jak ten

enter image description here

Zobacz w wyżej dałem odnośnik do mojego pliku w test_androt i gdy klikam to daje dailog z rozwiązaniem o nazwie pliku, nie wiem jak to osiągnąć nazwa pliku po kliknięciu łącza URL WebView.

Edit Przepraszam, zapomniałem wspomnieć, że moje URL wyglądać tak

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

robicie żądanie HTTP, aby pobrać ten plik. Jeśli tak, możesz pobrać nazwę pliku z treści nagłówka. – Raghunandan

Odpowiedz

9

Dostałem odpowiedź dzięki Raghunandanowi za sugestię.

Tutaj potrzebuję dodatkowego połączenia, aby uzyskać informacje o nagłówku pobieranego pliku. W sekcji nagłówka otrzymałem nazwę pliku.

Znalazłem także ten post Filename from URL not containing filename suffix, dzięki któremu uzyskałem więcej szczegółów dotyczących szczegółów nagłówka, które możemy uzyskać w odpowiednim czasie.

Jak możemy użyć tego URLUtil.guessFileName(url, null, null) ale to ze względu na nazwę pliku nazywając środki na moim przypadku mam url jak ten

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

więc z powyższego linku będzie wyodrębnić dnload.php jako nazwa pliku nie jest to oryginalna nazwa pliku, który pobieramy właśnie utworzony link do pobrania dla tego pliku.

o to kod przy użyciu tego możemy uzyskać nazwę pliku to tylko dodatkowe wywołanie, aby uzyskać informacje, ale faktycznie możemy pobrać, do pobrania Użyłem android wbudowany api do DownloadManager, aby pobrać plik.

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

Będzie powróci informacje jak ten sposób Content-Disposition: attachment; filename="fname.ext" więc teraz tylko trzeba wyodrębnić nazwy pliku

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

Należy rozważyć ['setRequestMethod (" HEAD ")'] (http://developer.android.com/reference/java/net/HttpURLConnection.html#setRequestMethod (java.lang.String)) zamiast żądania 'GET', ponieważ potrzebujesz tylko nagłówków. Ponadto, dla bardziej ogólnego przypadku, pamiętaj, że 'depo' może mieć wartość null,' depo' może być obecne, ale nie ma nazwy pliku, lub nazwa pliku może być zakodowana przez serwer na URL ze względu na [nietypowe zachowanie wszechobecnego Internet Explorer] (http://stackoverflow.com/q/93551/687315). – user113215

+0

@Pratik: Próbowałem powyższego podejścia, ale nie działało w moim przypadku. Czy możesz mi pomóc w związku z moim zapytaniem tutaj: http://stackoverflow.com/questions/24577166/get-the-file-image-name-from-t-url-which-does-not-end-witha-a- file-name-and-ext –

10

Można po prostu analizować URL i uzyskać tekst po ostatniej „/” i sprawiają, że nazwa pliku, albo mogli korzystać z następujących

URLUtil.guessFileName(url, contentDisposition, mimetype); 

pokazany poniżej jako Użyłem go w moim DownloadListener:

//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 
} 

Jeśli nie chcesz go używać w swoim DownloadListener, możesz użyć go bez właściwości contentDisposition lub typu MIME przez podanie "null" dla każdego parametru z wyjątkiem adresu url (podaj adres URL).

EDYCJA: Działa tylko, jeśli masz adres URL z zawartą w nim nazwą pliku. Zobacz odpowiedź Pratik powyżej, jeśli szukasz bardziej niezawodny sposób.

0

Niektóre udoskonalenia do sporządzania roztworu Pratik użytkownika.

Zmiany:

1) zamocowany przerwane ekstrakcji pliku o zawartości-Disposition

2) dodaje interfejs zwrotnego

Zastosowanie:

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

Kod:

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 ręcznie pobrać plik o nazwie:

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); 
    } 
} 

Kod:

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); 
    }