从服务器下载没有扩展名的文件

我尝试从以下URL下载mp3文件。 我find了很多关于文件下载的文章和例子。 这些示例基于以文件扩展名结尾的URL,例如: – yourdomain.com/filename.mp3但我想从以下url下载文件,该文件通常不以文件扩展名结尾。

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

**请注意,我使用上面的url,而不使用Stackoverflowurl格式化方法来轻松理解问题。

** 我已经尝试了@Arsal Imam的解决方案如下仍然无效

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

并且异步任务代码如下

 class DownloadFileFromURL extends AsyncTask { @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); } } 

虽然不建议将Volley库用于大型下载或流操作,但我想分享以下工作示例代码。

我们假设我们只下载MP3文件,因此我对扩展名进行了硬编码。 当然,我们应该更仔细地检查以避免exception(NullPointer …),例如检查标头是否包含"Content-Disposition"键…

希望这可以帮助!

排球定制课程:

 public class BaseVolleyRequest extends Request { private final Response.Listener mListener; private final Response.ErrorListener mErrorListener; public BaseVolleyRequest(String url, Response.Listener listener, Response.ErrorListener errorListener) { super(0, url, errorListener); this.mListener = listener; this.mErrorListener = errorListener; } @Override protected Response 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); } } 

然后在你的活动中:

 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() { @Override public void onResponse(NetworkResponse response) { Map 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(); } } } 

这里结果截图:

排球下载文件

注意:

正如我在下面评论的那样,因为直接下载Url会定期更改,所以您应该使用Postman for Chrome等一些工具检查新url,如果它回复二进制而不是网页(过期的url),那么url有效且我的代码适用于该url。

请参阅以下两个屏幕截图:

已过期的url:

已过期的网址

未过期的url:

未过期的网址

更新基本逻辑,直接从该网站的文档下载链接:

根据免费创建自己的YouTube到MP3下载器

你可以看看

JSON示例

您还可以通过将“format”参数设置为“JSON”来接收JSON中的数据。 http://YouTubeInMP3.com/fetch/?format=JSON&video=http://www.youtube.com/watch?v=i62Zjga8JOM

首先,您从上面的文件链接创建一个JsonObjectRequest获取响应。 然后,在这个JsonObjectRequest onResponse里面你会得到直接的下载链接,就像这个directUrl = response.getString("link"); 并使用BaseVolleyRequest volleyRequest

我刚刚告诉了获取直接url的逻辑,IMO,你应该自己实现它。 祝你好运!

使用下面的代码,它适用于加密的URL

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

该url返回302重定向到实际的.mp3。 浏览器会在后台为您重定向,但在您的应用中,您需要自己动手。 以下是如何使用HttpUrlConnection进行操作的示例http://www.mkyong.com/java/java-httpurlconnection-follow-redirect-example/

如果您事先知道文件的types,那么您可以从url下载没有扩展名的文件。

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

现在通过以下代码启动mainactivity中的服务:

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