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

Deh*_*ara 11 url mp3 android download

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

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

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

**我已经尝试了@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);
        }
    });
Run Code Online (Sandbox Code Playgroud)

并且异步任务代码如下

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

    }
}
Run Code Online (Sandbox Code Playgroud)

BNK*_*BNK 5

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

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

希望这可以帮助!

排球定制课程:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的活动中:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里结果截图:

排球下载文件

注意:

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

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

已过期的网址:

已过期的网址

未过期的网址:

未过期的网址

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

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

你可以看看

JSON示例

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

首先,您JsonObjectRequest从上面的文件链接创建一个获取响应.然后,在onResponse此内部JsonObjectRequest您将获得直接下载链接,如下所示directUrl = response.getString("link");并使用BaseVolleyRequest volleyRequest

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