2013-04-08 8 views
7

में यूआरएल पर क्लिक करते समय फ़ाइल का नाम कैसे प्राप्त करें फ़ाइल में उस फ़ाइल का नाम कैसे प्राप्त करें जिसे हमने सर्वर पर अपलोड किया था जब हम उस फ़ाइल के लिए पेज में लिंक करते थे?वेबव्यू

मैं जो कर रहा हूं वह है, मैं वेबव्यू में फ़ाइल लिंक के साथ डेटा प्रदान कर रहा हूं, इसलिए जब भी उपयोगकर्ता लिंक पर क्लिक करता है तो सर्वर से डाउनलोड करने की आवश्यकता होती है क्योंकि मैंने सर्वर से यह फ़ाइल डाउनलोड की है लेकिन समस्या इसके सटीक प्रकार को प्राप्त करने में सक्षम नहीं है और DownloadManager का उपयोग कर नाम। मैं ऊपर मैं test_androt में मेरी फ़ाइल के लिए लिंक दे दिया है और जब मैं क्लिक करें यह विकल्प फ़ाइल नाम होने के साथ dailog दे देंगे, मैं यह कैसे प्राप्त करने के लिए पता नहीं है में देखें इस

enter image description here

की तरह चाहते हैं फ़ाइल नाम जब उपयोगकर्ता WebView यूआरएल लिंक पर क्लिक करें।

संपादित क्षमा करें कि मेरी यूआरएल इस

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

आप फ़ाइल डाउनलोड करने के लिए एक http अनुरोध करते हैं। यदि ऐसा है तो आप हेडर सामग्री से फ़ाइल नाम प्राप्त कर सकते हैं। – Raghunandan

उत्तर

9

मुझे जवाब के लिए रघुनाथन का उत्तर धन्यवाद मिला।

यहां मुझे डाउनलोडिंग फ़ाइल की शीर्षलेख जानकारी प्राप्त करने के लिए अतिरिक्त कॉल करने की आवश्यकता है। शीर्षलेख अनुभाग में मुझे फ़ाइल का नाम मिला।

इसके अलावा मुझे यह Filename from URL not containing filename suffix पोस्ट मिला जिसके माध्यम से मुझे हेडर विवरण के बारे में अधिक जानकारी मिली जो हम समय पर अनुरोध कर सकते हैं।

हम इस URLUtil.guessFileName(url, null, null) उपयोग कर सकते हैं के रूप में, लेकिन यह मेरे मामले के लिए साधन बुलाने की फ़ाइल नाम दिया जाएगा मैं इस

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

तरह यूआरएल तो ऊपर के लिंक से इस dnload.php निकालने के रूप में है फ़ाइल का नाम यह मूल फ़ाइल नाम नहीं है जिसे हम डाउनलोड करते हैं, बस उस फ़ाइल के लिए डाउनलोड लिंक बनाया है।

यहाँ का उपयोग कर इस हम फ़ाइल नाम यह सिर्फ एक अतिरिक्त कॉल प्राप्त कर सकते हैं जानकारी पाने के लिए, लेकिन वास्तव में हम डाउनलोड, डाउनलोड के लिए मैं फ़ाइल डाउनलोड करने के लिए DownloadManager को एंड्रॉयड इनबिल्ट एपीआई का इस्तेमाल किया है कोड है।

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

यह इस तरह से Content-Disposition: attachment; filename="fname.ext" तरह की जानकारी वापस आ जाएगी करेंगे तो अब सिर्फ फ़ाइल नाम

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

विचार करें ['setRequestMethod (" HEAD ")'] (http://developer.android.com/reference/java/net/HttpURLConnection.html#setRequestMethod (java.lang.String)) 'GET' अनुरोध के बजाय) आप केवल हेडर चाहते हैं। साथ ही, अधिक सामान्य मामले के लिए, याद रखें कि 'डेपो' शून्य हो सकता है, 'डेपो' मौजूद हो सकता है लेकिन कोई फ़ाइल नाम नहीं है, या फ़ाइल नाम सर्वव्यापी के गैर-मानक व्यवहार के कारण सर्वर द्वारा यूआरएल-एन्कोड किया जा सकता है इंटरनेट एक्सप्लोरर] (http://stackoverflow.com/q/93551/687315)। – user113215

+0

@ प्रैटिक: मैंने उपरोक्त दृष्टिकोण की कोशिश की है लेकिन यह मेरे मामले में काम नहीं करता है। क्या आप मेरी क्वेरी से संबंधित मेरी मदद कर सकते हैं: http://stackoverflow.com/questions/24577166/get-the-file-image-name-from-the-url-which-does-not-end-with-a- फ़ाइल-नाम-और-ext –

10

की तरह लग रहे आप बस यूआरएल को पार्स सकता है और पिछले के बाद "/" पाठ मिलता है और उस फ़ाइल नाम बनाने, या आप का उल्लेख भूल गया करने के लिए

//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 
} 
: निम्नलिखित

URLUtil.guessFileName(url, contentDisposition, mimetype); 

नीचे दिखाया गया है मैं इसे अपने DownloadListener में इस्तेमाल किया है इस्तेमाल कर सकते हैं

यदि आप इसे अपने डाउनलोड लिस्टनर के अंदर उपयोग नहीं करना चाहते हैं, तो आप यूआरएल को छोड़कर (यूआरएल पास करने) को छोड़कर प्रत्येक पैरामीटर के लिए केवल 'शून्य' पास करके सामग्री डिस्प्लेशन या मिमटाइप का उपयोग कर सकते हैं।

संपादित करें: यह केवल तभी काम करता है जब आपके पास एम्बेडेड फ़ाइल नाम के साथ यूआरएल हो। यदि आप अधिक मूर्खतापूर्ण तरीके की तलाश में हैं तो प्रतिवादी का जवाब ऊपर देखें।

0

प्रतीक के समाधान के लिए कुछ शोधन निकालने के लिए की जरूरत है।

परिवर्तन:

1) तय टूटी हुई फ़ाइल नाम से निकासी सामग्री-विन्यास

2) कॉलबैक इंटरफ़ेस जोड़ा

उपयोग:

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

कोड:

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 मैन्युअल फ़ाइल नाम को पुनः प्राप्त करने:

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

कोड:

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