Télécharger un fichier sans extension depuis un serveur

J'essaie de télécharger un fichier mp3 à partir de l'URL suivante. J'ai trouvé beaucoup d'articles et d'exemples concernant le téléchargement de fichiers. Ces exemples sont basés sur des URL qui se terminent par une extension de fichier, par exemple: – yourdomain.com/filename.mp3 mais je souhaite télécharger un fichier à partir de l'URL qui ne se termine généralement pas par l'extension de fichier.

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

** Veuillez noter que j'utilise l'URL ci-dessus tel quel sans utiliser la méthode de mise en forme url Stackoverflow pour comprendre facilement la question.

** J'ai essayé la solution @Arsal Imam comme suit ne fonctionne toujours pas

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

Et le code de tâche asynchrone est le suivant

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

4 Solutions collect form web for “Télécharger un fichier sans extension depuis un serveur”

Bien que la bibliothèque Volley ne soit pas recommandée pour de grandes opérations de téléchargement ou de diffusion, j'aimerais partager mon exemple d'exemple suivant.

Supposons que nous téléchargeons uniquement des fichiers MP3 , de sorte que je raconte l'extension. Et bien sûr, nous devrions vérifier plus attentivement pour éviter les exceptions (NullPointer …), par exemple vérifier si les en-têtes contiennent une clé "Content-Disposition" ou non …

J'espère que cela t'aides!

Volley Classe personnalisée:

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

Ensuite, dans votre Activité:

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

Voici la capture d'écran du résultat:

Fichier de téléchargement Volley

REMARQUE:

Comme j'ai commenté ci-dessous, car l'URL de téléchargement direct régulièrement, vous devez vérifier la nouvelle URL avec certains outils tels que Postman for Chrome , s'il s'agit de réponses binaires au lieu d'une page Web (url expiré), l'URL est valide et mon code Fonctionne pour cette Url.

Reportez-vous aux deux captures d'écran suivantes:

Url expiré:

Url expiré

URL non expirée:

URL non expirée

MISE À JOUR DE LA LOGIQUE DE BASE POUR OBTENIR UN LIEN DIRECT DE TELECHARGER DE LA DOCUMENTATION DE CE SITE:

Selon Créer votre propre YouTube To MP3 Downloader gratuitement

Vous pouvez jeter un oeil à

JSON Exemple

Vous pouvez également recevoir les données dans JSON en définissant le paramètre "format" sur "JSON". http://YTubeEnglish.com/fetch/?format=JSON&video=http://www.youtube.com/watch?v=i62Zjga8JOM

Tout d'abord, vous créez un JsonObjectRequest obtenant une réponse à partir du lien de fichier ci-dessus. Ensuite, à l'intérieur de la onResponse de ce JsonObjectRequest vous obtiendrez le lien de téléchargement direct, comme ceci directUrl = response.getString("link"); Et utilisez BaseVolleyRequest volleyRequest

Je viens de dire la logique d'obtenir l'URL directe, IMO, vous devriez l'implémenter vous-même. Bonne chance!

Utilisez le code ci-dessous. Il fonctionne bien pour les URL chiffrées

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

L'url renvoie une redirection 302 à la version actuelle .mp3. Le navigateur effectue la redirection en arrière-plan pour vous, mais dans votre application, vous devez le faire vous-même. Voici un exemple sur la façon de le faire avec HttpUrlConnection http://www.mkyong.com/java/java-httpurlconnection-follow-redirect-example/

Si vous connaissez le type de fichier à l'avance, vous pouvez télécharger votre fichier de l'URL qui n'a pas d'extension.

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

Maintenant, démarrez le service dans votre activité par code ci-dessous:

 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); 
coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.