2015-09-10 9 views
12

Ich versuche, eine MP3-Datei von der folgenden URL herunterladen. Ich habe viele Artikel und Beispiele zum Herunterladen von Dateien gefunden. Diese Beispiele basieren auf URLs, die mit einer Dateierweiterung enden, beispielsweise: yourdomain.com/filename.mp3, aber ich möchte eine Datei von der folgenden URL herunterladen, die normalerweise nicht mit der Dateierweiterung endet.Laden Sie eine Datei ohne Erweiterung von einem Server

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

** Bitte beachten Sie, dass ich die oben genannte URL verwenden, wie sie ist, ohne Stackoverflow url Formatierung Methode leicht, die Frage zu verstehen.

** ich die @Arsal Imam-Lösung versucht haben, als Arbeits folgt noch nicht

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

und die Asynchron Aufgabencode ist als

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 Frage. Wussten Sie schon vorher die Dateierweiterung? –

+0

ist eine mp3-Datei. Ich versuche es von "youtubeinmp3.com/api", um die MP3-Version einer YouTube-API zu erhalten. Diese URL funktioniert gut, wenn Sie sie in die Browser-URL kopieren. aber ich muss es von Android-Anwendung herunterladen –

+0

Versuchen Sie, den MIME-Typ der Antwort dynamisch zu bekommen. Diese [Link] (http://stackoverflow.com/questions/9077933/how-to-find-mimetype-of-response) könnte Ihnen helfen. – avinash

Antwort

5

Obwohl Volley library ist nicht für den großen Download empfohlen oder Streaming-Operationen möchte ich jedoch meine folgenden teilen funktionierender Beispielcode.

Nehmen wir an, wir laden nur MP3 Dateien, damit ich die Erweiterung festcode. Und natürlich sollten wir genauer prüfen, um Ausnahmen zu vermeiden (NullPointer ...) wie zum Beispiel zu überprüfen, ob die Header "Content-Disposition" Schlüssel enthalten oder nicht ...

Hoffe, das hilft!

Volley Individuelle Klasse:

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

Dann in Ihrer Aktivität:

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

Hier das Ergebnis Screenshot:

Volley download file

HINWEIS:

Wie ich bemerkte unten, weil der direkte Download-URL regelmäßig, sollten Sie die neue URL mit einigen Tools wie Postman for Chrome, wenn es Antworten binäre anstelle einer Web-Seite (abgelaufen url) ändert überprüfen, dann Die URL ist gültig und mein Code funktioniert für diese URL.

finden Sie in den beiden folgenden Screenshots:

Expired url:

Expired url

Un-expired url:

Un-expired url

UPDATE BASIC-Logik für Direct Downloads LERNEN AUS DER DOKUMENTATION DIESER WEBSITE:

Nach Create Your Own YouTube To MP3 Downloader For Free

können Sie einen Blick auf

JSON Beispiel

Sie auch die Daten in JSON, indem der "Format" Parameter auf "JSON" empfangen kann. http://YouTubeInMP3.com/fetch/?format=JSON&video=http://www.youtube.com/watch?v=i62Zjga8JOM

Zunächst erstellen Sie eine JsonObjectRequest aus dem obigen Dateilink bekommt Antwort. Dann innen onResponse dieser JsonObjectRequest Sie den direkten Download-Link erhalten, wie diese directUrl = response.getString("link"); und verwenden BaseVolleyRequest volleyRequest

Ich habe gerade die Logik gesagt für die direkte URL bekommen, IMO, sollten Sie es selbst implementieren. Viel Glück!

+0

dies ist nicht für mich gearbeitet .. Ich habe es versucht. Es wirft immer einen Null-Zeiger-Exceptions bei 'String [] temp = contentDisposition.split (" filename = ");' Diese line.beause 'contentDisposition'-Variable ist' null' –

+0

Haben Sie es mit meiner URL versucht? Die echte Url, die du mit Postman in Chrome testen kannst :) – BNK

+0

ja ich habe es mit deiner url versucht –

4

Verwenden Sie den folgenden Code folgt es gut funktioniert für verschlüsselt URLs

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

Schöne Frage ...! –

+0

wenn die Download-URL kopieren in den Browser-Adressleiste einfügen .. seine Download .. aber nicht funktioniert auf diese Weise –

0

Wenn Sie den Typ der Datei im Voraus wissen, dann können Sie Ihre Datei von URL herunterladen, die keine Erweiterung haben.

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

      } 
     } 
    } 
} 

Now-Dienst in Ihrem mainactivity von Code unten beginnen:

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); 
Verwandte Themen