gpt4 book ai didi

java - 从 URL 下载 Java 文件 1) 您不知道扩展名[例如 .jpg] 或 2) 正在重定向到文件

转载 作者:行者123 更新时间:2023-12-03 03:18:28 24 4
gpt4 key购买 nike

问题是虽然我知道如何从 URL 下载 File ,例如:

http://i12.photobucket.com/albums/a206/zxc6/1_zps3e6rjofn.jpg

<小时/>

当涉及到如下文件时:

https://images.duckduckgo.com/iu/?u=http%3......

我不知道如何下载它。

<小时/>

我用来下载带有 IOUtils 的文件的代码如果扩展名可见,则效果很好,但在上面的示例中返回:

java.io.IOException: Server returned HTTP response code: 500 for URL: https://images.duckduckgo.com/iu/?u=http%3A%2F%2Fimages2.fanpop.com%2Fimage%2Fphotos%2F8900000%2FFirefox-firefox-8967915-1600-1200.jpg&f=1

即使您删除 &f=1

<小时/>

下载器的代码(用于测试目的......原型(prototype)):

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

import org.apache.commons.io.IOUtils;

public class Downloader {

private static class ProgressListener implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
// e.getSource() gives you the object of
// DownloadCountingOutputStream
// because you set it in the overriden method, afterWrite().
System.out.println("Downloaded bytes : " + ((DownloadProgressListener) e.getSource()).getByteCount());
}
}

/**
* Main Method
*
* @param args
*/
public static void main(String[] args) {
URL dl = null;
File fl = null;
String x = null;
OutputStream os = null;
InputStream is = null;
ProgressListener progressListener = new ProgressListener();
try {
fl = new File(System.getProperty("user.home").replace("\\", "/") + "/Desktop/image.jpg");
dl = new URL(
"https://images.duckduckgo.com/iu/?u=http%3A%2F%2Fimages2.fanpop.com%2Fimage%2Fphotos%2F8900000%2FFirefox-firefox-8967915-1600-1200.jpg&f=1");
os = new FileOutputStream(fl);
is = dl.openStream();

// http://i12.photobucket.com/albums/a206/zxc6/1_zps3e6rjofn.jpg

DownloadProgressListener dcount = new DownloadProgressListener(os);
dcount.setListener(progressListener);

URLConnection connection = dl.openConnection();

// this line give you the total length of source stream as a String.
// you may want to convert to integer and store this value to
// calculate percentage of the progression.
System.out.println("Content Length:" + connection.getHeaderField("Content-Length"));
System.out.println("Content Length with different way:" + connection.getContentType());

System.out.println("\n");

// begin transfer by writing to dcount, not os.
IOUtils.copy(is, dcount);

} catch (Exception e) {
System.out.println(e);
} finally {
IOUtils.closeQuietly(os);
IOUtils.closeQuietly(is);
}
}
}

DownloadProgressListener的代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;

import org.apache.commons.io.output.CountingOutputStream;

public class DownloadProgressListener extends CountingOutputStream {

private ActionListener listener = null;

public DownloadProgressListener(OutputStream out) {
super(out);
}

public void setListener(ActionListener listener) {
this.listener = listener;
}

@Override
protected void afterWrite(int n) throws IOException {
super.afterWrite(n);
if (listener != null) {
listener.actionPerformed(new ActionEvent(this, 0, null));
}
}

}

我在发帖前读过的问题:

1) Download file from url that doesn't end with .extension

2) http://www.mkyong.com/java/how-to-get-url-content-in-java/

3) Download file using java apache commons?

4) How to download and save a file from Internet using Java?

5) How to create file object from URL object

最佳答案

正如评论中所指出的,扩展名无关紧要。

这里的问题是尝试下载可能是重定向或可能只是异步调用参数的内容。

您的没有扩展名的超大网址已损坏,但我可以回答其他类型的潜在解决方案。

如果您观察 URL:

https://images.duckduckgo.com/iu/?u=http%3A%2F%2Fimages2.fan‌​pop.com%2Fimage%2Fph‌​otos%2F8900000%2FFir‌​efox-firefox-8967915‌​-1600-1200.jpg&f=1

图像的 URL 确实存在。它只是经过编码,应该很容易解码。 Java 中包含了解码库(java.net.URLDecoder),但是如果您想自己做,可以这样看:

http%3A%2F%2Fimages2.fan‌​pop.com%2Fimage%2Fph‌​otos%2F8900000%2FFir‌​efox-firefox-8967915‌​-1600-1200.jpg&f=1

编码部分为%XX哪里XX是任意两个字符。查看 HTML 编码表,您会看到 %3A显然,是一个冒号。 %2F是一个正斜杠。

如果替换所有编码实体,您最终将得到: http://images2.fan‌​pop.com/image/ph‌​otos/8900000/Fir‌​efox-firefox-8967915‌​-1600-1200.jpg&f=1

在这种情况下,您不需要额外的参数,因此您可以丢弃 &f=1并从原始 URL 下载图像。在大多数情况下,我想您可以保留额外的参数,并且它会被忽略。

--

简而言之:

  1. 提取原始网址
  2. 解码
  3. 下载

我想指出这是一个脆弱的解决方案,如果 URL 模式发生变化,就会崩溃,否则需要大量维护。如果您的目标用户不只是一小部分用户,您应该重新考虑您的方法。

HTML URL encoding table

关于java - 从 URL 下载 Java 文件 1) 您不知道扩展名[例如 .jpg] 或 2) 正在重定向到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41905086/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com