2015-09-10 13 views
12

Sto provando a scaricare un file mp3 dal seguente URL. Ho trovato molti articoli ed esempi riguardanti il ​​download dei file. Questi esempi si basano su URL che terminano con un'estensione di file, ad esempio: yourdomain.com/filename.mp3 ma voglio scaricare un file dal seguente URL che in genere non termina con l'estensione del file.Scaricare un file senza estensione da un server

youtubeinmp3.com/download/get/?i=1gsE32jF0aVaY0smDVf%2BmwnIZPrMDnGmchHBu0Hovd3Hl4NYqjNdym4RqjDSAis7p1n5O%2BeXmdwFxK9ugErLWQ%3D%3D

** Si prega di notare che io uso l'url sopra così com'è senza utilizzare StackOverflow metodo di formattazione url di comprendere facilmente la questione.

** Ho provato la soluzione del @Arsal Imam come segue ancora non funziona

btnShowProgress.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // starting new Async Task 
      File cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"Folder Name"); 
      if(!cacheDir.exists()) 
       cacheDir.mkdirs(); 

      File f=new File(cacheDir,"ddedddddd.mp3"); 
      saveDir=f.getPath(); 

      new DownloadFileFromURL().execute(fileURL); 
     } 
    }); 

e il codice asincrono compito è la seguente

class DownloadFileFromURL extends AsyncTask<String, String, String> { 

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

    @Override 
    protected String doInBackground(String... f_url) { 
     try{ 

      URL url = new URL(fileURL); 
      HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); 
      int responseCode = httpConn.getResponseCode(); 

      // always check HTTP response code first 
      if (responseCode == HttpURLConnection.HTTP_OK) { 
       String fileName = ""; 
       String disposition = httpConn.getHeaderField("Content-Disposition"); 
       String contentType = httpConn.getContentType(); 
       int contentLength = httpConn.getContentLength(); 

       if (disposition != null) { 
        // extracts file name from header field 
        int index = disposition.indexOf("filename="); 
        if (index > 0) { 
         fileName = disposition.substring(index + 10, 
           disposition.length() - 1); 
        } 
       } else { 
        // extracts file name from URL 
        fileName = fileURL.substring(fileURL.lastIndexOf("/") + 1, 
          fileURL.length()); 
       } 

       System.out.println("Content-Type = " + contentType); 
       System.out.println("Content-Disposition = " + disposition); 
       System.out.println("Content-Length = " + contentLength); 
       System.out.println("fileName = " + fileName); 

       // opens input stream from the HTTP connection 
       InputStream inputStream = httpConn.getInputStream(); 
       String saveFilePath = saveDir + File.separator + fileName; 

       // opens an output stream to save into file 
       FileOutputStream outputStream = new FileOutputStream(saveDir); 

       int bytesRead = -1; 
       byte[] buffer = new byte[BUFFER_SIZE]; 
       while ((bytesRead = inputStream.read(buffer)) != -1) { 
        outputStream.write(buffer, 0, bytesRead); 
       } 

       outputStream.close(); 
       inputStream.close(); 

       System.out.println("File downloaded"); 
      } else { 
       System.out.println("No file to download. Server replied HTTP code: " + responseCode); 
      } 
      httpConn.disconnect(); 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    protected void onProgressUpdate(String... progress) { 
     pDialog.setProgress(Integer.parseInt(progress[0])); 
    } 

    @Override 
    protected void onPostExecute(String file_url) { 
     dismissDialog(progress_bar_type); 

    } 
} 
+0

Interessante domanda. Sapevi in ​​anticipo l'estensione del file? –

+0

è un file mp3. Lo sto provando da 'youtubeinmp3.com/api' per ottenere la versione mp3 di un youtube api. questo url funziona bene quando lo copi incollandolo nell'URL del browser. ma ho bisogno di scaricarlo dall'applicazione Android –

+0

Cercare di ottenere il tipo MIME della risposta in modo dinamico. Questo [collegamento] (http://stackoverflow.com/questions/9077933/how-to-find-mimetype-of-response) potrebbe aiutarti. – avinash

risposta

5

Anche se Volley library non è raccomandato per il download di grandi dimensioni o operazioni di streaming, tuttavia, mi piacerebbe condividere il mio seguito codice di esempio funzionante.

Supponiamo di scaricare solo file MP3 in modo da indurire l'estensione. E, naturalmente, dovremmo controllare con più attenzione per evitare eccezioni (NullPointer ...) come controllare se le intestazioni contengono "Content-Disposition" o no ...

Spero che questo aiuti!Classe

Volley personalizzato:

public class BaseVolleyRequest extends Request<NetworkResponse> { 

    private final Response.Listener<NetworkResponse> mListener; 
    private final Response.ErrorListener mErrorListener; 

    public BaseVolleyRequest(String url, Response.Listener<NetworkResponse> listener, Response.ErrorListener errorListener) { 
     super(0, url, errorListener); 
     this.mListener = listener; 
     this.mErrorListener = errorListener; 
    } 

    @Override 
    protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) { 
     try { 
      return Response.success(
        response, 
        HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (JsonSyntaxException e) { 
      return Response.error(new ParseError(e)); 
     } catch (Exception e) { 
      return Response.error(new ParseError(e)); 
     } 
    } 

    @Override 
    protected void deliverResponse(NetworkResponse response) { 
     mListener.onResponse(response); 
    } 

    @Override 
    protected VolleyError parseNetworkError(VolleyError volleyError) { 
     return super.parseNetworkError(volleyError); 
    } 

    @Override 
    public void deliverError(VolleyError error) { 
     mErrorListener.onErrorResponse(error); 
    } 
} 

Poi, nel tuo attività:

public class BinaryVolleyActivity extends AppCompatActivity { 

    private final Context mContext = this; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_binary_volley); 
     RequestQueue requestQueue = Volley.newRequestQueue(mContext); 
     String url = "http://www.youtubeinmp3.com/download/get/?i=3sI2yV5mJ0kQ8CnddqmANZqK8a%2BgVQJ%2Fmg3xwhHTUsJKuusOCZUzebuWW%2BJSFs0oz8VTs6ES3gjohKQMogixlQ%3D%3D"; 
     BaseVolleyRequest volleyRequest = new BaseVolleyRequest(url, new Response.Listener<NetworkResponse>() { 
      @Override 
      public void onResponse(NetworkResponse response) {      
       Map<String, String> headers = response.headers; 
       String contentDisposition = headers.get("Content-Disposition"); 
       // String contentType = headers.get("Content-Type"); 
       String[] temp = contentDisposition.split("filename="); 
       String fileName = temp[1].replace("\"", "") + ".mp3"; 
       InputStream inputStream = new ByteArrayInputStream(response.data); 
       createLocalFile(inputStream, fileName); 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.e("Volley", error.toString()); 
      } 
     }); 

     volleyRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 10, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

     requestQueue.add(volleyRequest); 
    } 

    private String createLocalFile(InputStream inputStream, String fileName) { 
     try { 
      String folderName = "MP3VOLLEY"; 
      String extStorageDirectory = Environment.getExternalStorageDirectory().toString(); 
      File folder = new File(extStorageDirectory, folderName); 
      folder.mkdir(); 
      File file = new File(folder, fileName); 
      file.createNewFile(); 
      FileOutputStream f = new FileOutputStream(file); 
      byte[] buffer = new byte[1024]; 
      int length; 
      while ((length = inputStream.read(buffer)) > 0) { 
       f.write(buffer, 0, length); 
      } 
      //f.flush(); 
      f.close(); 
      return file.getPath(); 
     } catch (IOException e) { 
      return e.getMessage(); 
     } 
    } 
} 

Ecco il risultato screenshot:

Volley download file

NOTA:

Come ho già commentato in basso, perché l'URL di download diretta cambia regolarmente, si dovrebbe verificare il nuovo URL con alcuni strumenti come Postman for Chrome, se le risposte binario invece di una pagina Web (URL scaduto), poi l'Url è valido e il mio codice funziona per quell'URL.

sono relativi alle due seguenti schermate:

url Scaduto: url

Expired url

Un scaduto:

Un-expired url

UPDATE logica di base per ottenere Direct Download LINK DALLA DOCUMENTAZIONE DI QUESTO SITO:

Secondo Create Your Own YouTube To MP3 Downloader For Free

Si può dare un'occhiata al

JSON Esempio

È inoltre possibile ricevere i dati in JSON impostando il "formato" parametro su "JSON". http://YouTubeInMP3.com/fetch/?format=JSON&video=http://www.youtube.com/watch?v=i62Zjga8JOM

In primo luogo, si crea un JsonObjectRequest ricevendo risposta dal link del file sopra. Poi, all'interno di questo onResponseJsonObjectRequest si otterrà il link di download diretto, come questo directUrl = response.getString("link"); e utilizzare BaseVolleyRequest volleyRequest

ho appena detto la logica per ottenere URL diretto, IMO, è necessario implementare da soli. In bocca al lupo!

+0

questo non ha funzionato per me .. Ho provato. Genera sempre eccezioni di un puntatore nullo a 'String [] temp = contentDisposition.split (" filename = ");' questa linea. Perché la variabile 'contentDisposition' è' null' –

+0

Hai provato con il mio Url? Che il vero URL che puoi testare con Postman in Chrome :) – BNK

+0

sì, ho provato con il tuo url –

4

Usa sottostante Codice tutto funziona bene per URL crittografati

public class HttpDownloadUtility { 
    private static final int BUFFER_SIZE = 4096; 

    /** 
    * Downloads a file from a URL 
    * @param fileURL HTTP URL of the file to be downloaded 
    * @param saveDir path of the directory to save the file 
    * @throws IOException 
    */ 
    public static void downloadFile(String fileURL, String saveDir) 
      throws IOException { 
     URL url = new URL(fileURL); 
     HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); 
     int responseCode = httpConn.getResponseCode(); 

     // always check HTTP response code first 
     if (responseCode == HttpURLConnection.HTTP_OK) { 
      String fileName = ""; 
      String disposition = httpConn.getHeaderField("Content-Disposition"); 
      String contentType = httpConn.getContentType(); 
      int contentLength = httpConn.getContentLength(); 

      if (disposition != null) { 
       // extracts file name from header field 
       int index = disposition.indexOf("filename="); 
       if (index > 0) { 
        fileName = disposition.substring(index + 10, 
          disposition.length() - 1); 
       } 
      } else { 
       // extracts file name from URL 
       fileName = fileURL.substring(fileURL.lastIndexOf("/") + 1, 
         fileURL.length()); 
      } 

      System.out.println("Content-Type = " + contentType); 
      System.out.println("Content-Disposition = " + disposition); 
      System.out.println("Content-Length = " + contentLength); 
      System.out.println("fileName = " + fileName); 

      // opens input stream from the HTTP connection 
      InputStream inputStream = httpConn.getInputStream(); 
      String saveFilePath = saveDir + File.separator + fileName; 

      // opens an output stream to save into file 
      FileOutputStream outputStream = new FileOutputStream(saveFilePath); 

      int bytesRead = -1; 
      byte[] buffer = new byte[BUFFER_SIZE]; 
      while ((bytesRead = inputStream.read(buffer)) != -1) { 
       outputStream.write(buffer, 0, bytesRead); 
      } 

      outputStream.close(); 
      inputStream.close(); 

      System.out.println("File downloaded"); 
     } else { 
      System.out.println("No file to download. Server replied HTTP code: " + responseCode); 
     } 
     httpConn.disconnect(); 
    } 
} 
+0

Bella domanda ...! –

+0

quando l'url di download copia incolla nella barra dell'indirizzo del browser .. il suo download .. ma non funziona in questo modo –

0

Se si conosce il tipo di file in anticipo, è possibile scaricare il file dall'URL che non ha estensione.

DownloadService .java

public class DownloadService extends IntentService { 
    public static final int UPDATE_PROGRESS = 8344; 
    private Context context; 
    private PowerManager.WakeLock mWakeLock; 
    ProgressDialog mProgressDialog; 
    String filename; 
    File mypath; 
    String urlToDownload; 
    BroadcastReceiver broadcaster; 
    Intent intent1; 
    static final public String BROADCAST_ACTION = "com.example.app.activity.test.broadcast"; 
    public DownloadService() { 
     super("DownloadService"); 
    } 
    @Override 
    public void onCreate() { 
     // TODO Auto-generated method stub 
     super.onCreate(); 
     intent1 = new Intent(BROADCAST_ACTION); 
    } 
    @Override 
    protected void onHandleIntent(Intent intent) { 

     ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver"); 
     try { 
      intent1 = new Intent(BROADCAST_ACTION); 
      urlToDownload = intent.getStringExtra("url"); 
      filename= intent.getStringExtra("filename"); 

      BufferedWriter out; 
      try { 
       File path=new File("/sdcard/","folder name"); 
       path.mkdir(); 
       mypath=new File(path,filename); 
       Log.e("mypath",""+mypath); 
       if (!mypath.exists()) { 
        out= new BufferedWriter(new FileWriter(mypath)); 
        //ut = new OutputStreamWriter(context.openFileOutput(mypath.getAbsolutePath() ,Context.MODE_PRIVATE)); 
        out.write("test"); 
        out.close(); 

       } 

      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
      URL url = new URL(urlToDownload); 
      URLConnection connection = url.openConnection(); 
      connection.connect(); 
      // this will be useful so that you can show a typical 0-100% progress bar 
      int fileLength = connection.getContentLength(); 

      // download the file 
      InputStream input = new BufferedInputStream(connection.getInputStream()); 
      OutputStream output = new FileOutputStream(mypath); 

      byte data[] = new byte[4096]; 
      long total = 0; 
      int count; 
      while ((count = input.read(data)) != -1) { 
       total += count; 
       // publishing the progress.... 
       Bundle resultData = new Bundle(); 
       resultData.putInt("progress" ,(int) (total * 100/fileLength)); 


       //Log.e("mypath",""+mypath); 
       resultData.putString("mypath", ""+mypath); 
       receiver.send(UPDATE_PROGRESS, resultData);   

       output.write(data, 0, count); 
      } 

      output.flush(); 
      output.close(); 
      input.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     Bundle resultData = new Bundle(); 
     resultData.putInt("progress" ,100); 
     resultData.putString("mypath", ""+mypath); 
     receiver.send(UPDATE_PROGRESS, resultData); 
     intent1.putExtra("progressbar", 100); 
     sendBroadcast(intent1); 
    } 
} 

DownloadReceiver.java

public class DownloadReceiver extends ResultReceiver{ 

    private Context context; 
    private PowerManager.WakeLock mWakeLock; 
    ProgressDialog mProgressDialog; 
    String filename; 

    String mypath; 
    public DownloadReceiver(Handler handler ,String filename ,Context context) { 
     super(handler); 

    this.context = context; 
     this.filename = filename; 

     mProgressDialog = new ProgressDialog(context); 
    } 

    @Override 
    protected void onReceiveResult(int resultCode, Bundle resultData) { 
     super.onReceiveResult(resultCode, resultData); 
     if (resultCode == DownloadService.UPDATE_PROGRESS) { 
      int progress = resultData.getInt("progress"); 
      mypath = resultData.getString("mypath"); 
      mProgressDialog.setProgress(progress); 
      //Log.e("progress","progress"); 
      mProgressDialog.setMessage("App name"); 
      mProgressDialog.setIndeterminate(true); 
      mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      mProgressDialog.setCancelable(true); 
      if (progress == 100) { 
       mProgressDialog.dismiss(); 

      Log.e("download","download"); 

      } 
     } 
    } 
} 

Ora avviare il servizio nel mainactivity dal codice qui sotto:

Intent miIntent = new Intent(mContext, DownloadService.class); 
          miIntent.putExtra("url", url); 
          miIntent.putExtra("filename", id+".mp3"); 

          miIntent.putExtra("receiver", new DownloadReceiver(new Handler() , id,mContext)); 
          startService(miIntent); 
Problemi correlati