I'm downloading an ePub file from a URL.
我正在从URL下载ePub文件。
Now I want to implement a mechanism by which if user tries to re-download the same file, he should get warning/error message and that file should not be downloaded again.
现在我想实现一种机制,如果用户尝试重新下载相同的文件,他应该收到警告/错误消息,并且不应该再次下载该文件。
To implement this, I need to check the name of the file present in my library with the name of the file user is trying to download.
为了实现这一点,我需要检查我的库中存在的文件的名称,以及用户试图下载的文件的名称。
But I just have this download link, and not the file name.
但我只有这个下载链接,而不是文件名。
How to get the name of the file before download in order to compare it with the existing file?
如何在下载之前获取文件的名称,以便将其与现有文件进行比较?
5 个解决方案
#1
59
In android you can use the guessFileName() method:
在android中你可以使用guessFileName()方法:
URLUtil.guessFileName(url, null, null)
Alternatively, a simplistic solution in Java could be:
或者,Java中的简单解决方案可以是:
String fileName = url.substring(url.lastIndexOf('/') + 1);
(Assuming your url is in the format: http://xxxxxxxxxxxxx/filename.ext
)
(假设您的网址格式为:http://xxxxxxxxxxxxx/filename.ext)
UPDATE March 23, 2018
更新2018年3月23日
This question is getting lots of hits and someone commented my 'simple' solution does not work with certain urls so I felt the need to improve the answer.
这个问题得到了很多点击,有人评论我的“简单”解决方案不适用于某些网址,所以我觉得有必要改进答案。
In case you want to handle more complex url pattern, I provided a sample solution below. It gets pretty complex quite quickly and I'm pretty sure there are some odd cases my solution still can't handle but nevertheless here it goes:
如果您想处理更复杂的url模式,我在下面提供了一个示例解决方案。它变得相当复杂很快,我很确定有一些奇怪的情况,我的解决方案仍然无法处理,但在这里它是:
public static String getFileNameFromURL(String url) {
if (url == null) {
return "";
}
try {
URL resource = new URL(url);
String host = resource.getHost();
if (host.length() > 0 && url.endsWith(host)) {
// handle ...example.com
return "";
}
}
catch(MalformedURLException e) {
return "";
}
int startIndex = url.lastIndexOf('/') + 1;
int length = url.length();
// find end index for ?
int lastQMPos = url.lastIndexOf('?');
if (lastQMPos == -1) {
lastQMPos = length;
}
// find end index for #
int lastHashPos = url.lastIndexOf('#');
if (lastHashPos == -1) {
lastHashPos = length;
}
// calculate the end index
int endIndex = Math.min(lastQMPos, lastHashPos);
return url.substring(startIndex, endIndex);
}
This method can handle these type of input:
此方法可以处理这些类型的输入:
Input: "null" Output: ""
Input: "" Output: ""
Input: "file:///home/user/test.html" Output: "test.html"
Input: "file:///home/user/test.html?id=902" Output: "test.html"
Input: "file:///home/user/test.html#footer" Output: "test.html"
Input: "http://example.com" Output: ""
Input: "http://www.example.com" Output: ""
Input: "http://www.example.txt" Output: ""
Input: "http://example.com/" Output: ""
Input: "http://example.com/a/b/c/test.html" Output: "test.html"
Input: "http://example.com/a/b/c/test.html?param=value" Output: "test.html"
Input: "http://example.com/a/b/c/test.html#anchor" Output: "test.html"
Input: "http://example.com/a/b/c/test.html#anchor?param=value" Output: "test.html"
You can find the whole source code here: https://ideone.com/uFWxTL
您可以在此处找到完整的源代码:https://ideone.com/uFWxTL
#2
38
Try to use URLUtil.guessFileName(url, null, null)
for example. I think this is the best Android way.
例如,尝试使用URLUtil.guessFileName(url,null,null)。我认为这是最好的Android方式。
More info here: https://developer.android.com/reference/android/webkit/URLUtil.html#guessFileName(java.lang.String, java.lang.String, java.lang.String)
更多信息:https://developer.android.com/reference/android/webkit/URLUtil.html#guessFileName(java.lang.String,java.lang.String,java.lang.String)
#3
7
Keep it simple :
把事情简单化 :
/**
* This function will take an URL as input and return the file name.
* <p>Examples :</p>
* <ul>
* <li>http://example.com/a/b/c/test.txt -> test.txt</li>
* <li>http://example.com/ -> an empty string </li>
* <li>http://example.com/test.txt?param=value -> test.txt</li>
* <li>http://example.com/test.txt#anchor -> test.txt</li>
* </ul>
*
* @param url The input URL
* @return The URL file name
*/
public static String getFileNameFromUrl(URL url) {
String urlString = url.getFile();
return urlString.substring(urlString.lastIndexOf('/') + 1).split("\\?")[0].split("#")[0];
}
#4
2
You dont really have to compare file names. Just make File object for the file with absolute path and check if file exists.
你真的不必比较文件名。只需为具有绝对路径的文件创建File对象,并检查文件是否存在。
protected boolean need2Download(String fileName) {
File basePath = new File(BOOK_STORE_PATH);
File fullPath = new File(basePath, fileName);
if (fullPath.exists())
return false;
return true;
}
protected void downloadFile(String url) {
String fileName = url.substring(url.lastIndexOf('/') + 1);
if (need2Download(fileName)) {
// download
}
}
#5
1
I think using URL#getPath() should simplify things.
我认为使用URL#getPath()应该简化一些事情。
public static String getFileNameFromUrl(URL url) {
String urlPath = url.getPath();
return urlPath.substring(urlPath.lastIndexOf('/') + 1);
}
See, http://developer.android.com/reference/java/net/URL.html#getPath()
#1
59
In android you can use the guessFileName() method:
在android中你可以使用guessFileName()方法:
URLUtil.guessFileName(url, null, null)
Alternatively, a simplistic solution in Java could be:
或者,Java中的简单解决方案可以是:
String fileName = url.substring(url.lastIndexOf('/') + 1);
(Assuming your url is in the format: http://xxxxxxxxxxxxx/filename.ext
)
(假设您的网址格式为:http://xxxxxxxxxxxxx/filename.ext)
UPDATE March 23, 2018
更新2018年3月23日
This question is getting lots of hits and someone commented my 'simple' solution does not work with certain urls so I felt the need to improve the answer.
这个问题得到了很多点击,有人评论我的“简单”解决方案不适用于某些网址,所以我觉得有必要改进答案。
In case you want to handle more complex url pattern, I provided a sample solution below. It gets pretty complex quite quickly and I'm pretty sure there are some odd cases my solution still can't handle but nevertheless here it goes:
如果您想处理更复杂的url模式,我在下面提供了一个示例解决方案。它变得相当复杂很快,我很确定有一些奇怪的情况,我的解决方案仍然无法处理,但在这里它是:
public static String getFileNameFromURL(String url) {
if (url == null) {
return "";
}
try {
URL resource = new URL(url);
String host = resource.getHost();
if (host.length() > 0 && url.endsWith(host)) {
// handle ...example.com
return "";
}
}
catch(MalformedURLException e) {
return "";
}
int startIndex = url.lastIndexOf('/') + 1;
int length = url.length();
// find end index for ?
int lastQMPos = url.lastIndexOf('?');
if (lastQMPos == -1) {
lastQMPos = length;
}
// find end index for #
int lastHashPos = url.lastIndexOf('#');
if (lastHashPos == -1) {
lastHashPos = length;
}
// calculate the end index
int endIndex = Math.min(lastQMPos, lastHashPos);
return url.substring(startIndex, endIndex);
}
This method can handle these type of input:
此方法可以处理这些类型的输入:
Input: "null" Output: ""
Input: "" Output: ""
Input: "file:///home/user/test.html" Output: "test.html"
Input: "file:///home/user/test.html?id=902" Output: "test.html"
Input: "file:///home/user/test.html#footer" Output: "test.html"
Input: "http://example.com" Output: ""
Input: "http://www.example.com" Output: ""
Input: "http://www.example.txt" Output: ""
Input: "http://example.com/" Output: ""
Input: "http://example.com/a/b/c/test.html" Output: "test.html"
Input: "http://example.com/a/b/c/test.html?param=value" Output: "test.html"
Input: "http://example.com/a/b/c/test.html#anchor" Output: "test.html"
Input: "http://example.com/a/b/c/test.html#anchor?param=value" Output: "test.html"
You can find the whole source code here: https://ideone.com/uFWxTL
您可以在此处找到完整的源代码:https://ideone.com/uFWxTL
#2
38
Try to use URLUtil.guessFileName(url, null, null)
for example. I think this is the best Android way.
例如,尝试使用URLUtil.guessFileName(url,null,null)。我认为这是最好的Android方式。
More info here: https://developer.android.com/reference/android/webkit/URLUtil.html#guessFileName(java.lang.String, java.lang.String, java.lang.String)
更多信息:https://developer.android.com/reference/android/webkit/URLUtil.html#guessFileName(java.lang.String,java.lang.String,java.lang.String)
#3
7
Keep it simple :
把事情简单化 :
/**
* This function will take an URL as input and return the file name.
* <p>Examples :</p>
* <ul>
* <li>http://example.com/a/b/c/test.txt -> test.txt</li>
* <li>http://example.com/ -> an empty string </li>
* <li>http://example.com/test.txt?param=value -> test.txt</li>
* <li>http://example.com/test.txt#anchor -> test.txt</li>
* </ul>
*
* @param url The input URL
* @return The URL file name
*/
public static String getFileNameFromUrl(URL url) {
String urlString = url.getFile();
return urlString.substring(urlString.lastIndexOf('/') + 1).split("\\?")[0].split("#")[0];
}
#4
2
You dont really have to compare file names. Just make File object for the file with absolute path and check if file exists.
你真的不必比较文件名。只需为具有绝对路径的文件创建File对象,并检查文件是否存在。
protected boolean need2Download(String fileName) {
File basePath = new File(BOOK_STORE_PATH);
File fullPath = new File(basePath, fileName);
if (fullPath.exists())
return false;
return true;
}
protected void downloadFile(String url) {
String fileName = url.substring(url.lastIndexOf('/') + 1);
if (need2Download(fileName)) {
// download
}
}
#5
1
I think using URL#getPath() should simplify things.
我认为使用URL#getPath()应该简化一些事情。
public static String getFileNameFromUrl(URL url) {
String urlPath = url.getPath();
return urlPath.substring(urlPath.lastIndexOf('/') + 1);
}
See, http://developer.android.com/reference/java/net/URL.html#getPath()