首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法从返回重定向的URL下载文件

无法从返回重定向的URL下载文件
EN

Stack Overflow用户
提问于 2018-06-29 01:45:20
回答 2查看 1.2K关注 0票数 1

我正在尝试从远程服务器下载一组文件到本地文件。

这应该很简单,我尝试了两种不同的方法,但每种方法都有优缺点。

第一种方法- Apache HttpGet/CloseableHttpResponse

代码语言:javascript
复制
CloseableHttpClient closeableHttpClient = HttpClients.createDefault();

URL encodeUrl = new URL(UriUtils.encodePath(documentUrl, StandardCharsets.UTF_8.name()));

File file = new File(tmpdir + File.separator + FilenameUtils.getName(doc.getDocumentURL()));

HttpGet httpget = new HttpGet(encodeUrl.toString());

HttpEntity entity = null;

try(CloseableHttpResponse response = closeableHttpClient.execute(httpget) {

    entity = response.getEntity();

    FileUtils.copyInputStreamToFile(entity.getContent(), file);

} finally {
    EntityUtils.consumeQuietly(entity);
}

第二种方法- FileUtils.copyURLToFile

代码语言:javascript
复制
URL encodeUrl = new URL(UriUtils.encodePath(documentUrl, StandardCharsets.UTF_8.name()));

String filename = FilenameUtils.getName(documentUrl);

File file = new File(tmpdir + File.separator + filename);

FileUtils.copyURLToFile(encodeUrl, file, 10000, 30000);

我对这两种方法都有问题。

Apache 1.使用 HttpGet/CloseableHttpResponse:

有些URL的名称中包含空格,甚至是奇怪的字符,例如:

http://download-service/Document Number 2015 .pdf

所有名称正确的文件都已正确下载,但名称不正确的文件出现以下错误:

代码语言:javascript
复制
org.apache.http.client.ClientProtocolException: null
        ...
Caused by: org.apache.http.ProtocolException: Invalid redirect URI: http://download-service/Document Number 2015 .pdf
        at org.apache.http.impl.client.DefaultRedirectStrategy.createLocationURI(DefaultRedirectStrategy.java:200) ~[httpclient-4.5.5.jar:4.5.5]
        at org.apache.http.impl.client.DefaultRedirectStrategy.getLocationURI(DefaultRedirectStrategy.java:148) ~[httpclient-4.5.5.jar:4.5.5]
        at org.apache.http.impl.client.DefaultRedirectStrategy.getRedirect(DefaultRedirectStrategy.java:221) ~[httpclient-4.5.5.jar:4.5.5]
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:122) ~[httpclient-4.5.5.jar:4.5.5]
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) ~[httpclient-4.5.5.jar:4.5.5]
        ... 108 common frames omitted
Caused by: java.net.URISyntaxException: Illegal character in path at index 48: http://download-service/Document Number 2015 .pdf
        at java.net.URI$Parser.fail(URI.java:2848) ~[na:1.8.0_131]
        at java.net.URI$Parser.checkChars(URI.java:3021) ~[na:1.8.0_131]
        at java.net.URI$Parser.parseHierarchical(URI.java:3105) ~[na:1.8.0_131]
        at java.net.URI$Parser.parse(URI.java:3053) ~[na:1.8.0_131]
        at java.net.URI.<init>(URI.java:588) ~[na:1.8.0_131]
        at org.apache.http.impl.client.DefaultRedirectStrategy.createLocationURI(DefaultRedirectStrategy.java:189) ~[httpclient-4.5.5.jar:4.5.5]
        ... 112 common frames omitted

2.使用FileUtils.copyURLToFile:

在这种情况下,不会发生上述错误,所有文件看起来都已正确下载,但所有文件都是空的。

我已经阅读了关于这两种方法的文档,但我不能理解这两种方法的失败之处。

EN

回答 2

Stack Overflow用户

发布于 2018-06-29 06:44:54

我研究了以下错误,并开始怀疑问题可能与服务器执行的重定向有关:

代码语言:javascript
复制
Caused by: org.apache.http.ProtocolException: Invalid redirect URI:

因此,我创建了一个CustomRedirectStrategy,它将在重定向上执行URI编码:

代码语言:javascript
复制
public class CustomRedirectStrategy extends DefaultRedirectStrategy {

    @Override
    public URI getLocationURI(HttpRequest request, HttpResponse response, HttpContext context) throws ProtocolException {
        try {
            String uri = response.getFirstHeader("location").getValue();
            URL url = new URL(uri);
            return new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
        } catch (Exception ex){
            throw new ProtocolException(ex.getMessage());
        }
    }
}

他们将这一策略应用于CloseableHttpClient:

代码语言:javascript
复制
CloseableHttpClient client = HttpClients.custom().setRedirectStrategy(new CustomRedirectStrategy()).build();

通过此更改,所有文件现在都可以正确下载。

票数 1
EN

Stack Overflow用户

发布于 2018-06-29 01:49:54

我认为你应该尝试这样编码你的网址:Encode URL

似乎,在这两种情况下,你只是得到了错误的URL。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51088772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档