我试图从某个url下载图片,但不能这样做,因为我不知何故必须给正确的用户客户端到网站。我确信问题是,我不能给用户客户端,而使用Url类,因为页面可以通过浏览器访问。我尝试使用代理和url连接,但不能让它工作。请分享你对这件事的看法!
我的代码如下:import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.SocketAddress;
import java.net.URL;
import java.net.URLConnection;
import javax.imageio.ImageIO;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
public class KepLetolto {
public static void main(String[] args) throws IOException {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
File file = new File("tempjpeg");
SocketAddress address = new java.net.InetSocketAddress("xyz.com", 8080);
// Create an HTTP Proxy using the above SocketAddress.
Proxy proxy = new Proxy(Proxy.Type.HTTP, address);
URL url_kep =new URL("http://www.theouthousers.com/images/templates/thumbnails/128058/bayfinger_size3.png");
ImageIO.write(ImageIO.read(url_kep), "jpeg", file);
Mat uj = Highgui.imread("temp.jpeg" ,Highgui.CV_LOAD_IMAGE_COLOR);
}
}
不要使用ImageIO.read(URL)
,它限制了URL的底层URLConnection
的默认行为,使用ImageIO.read(InputStream)
。
这允许您使用任何HTTP客户端库—包括基本的HttpURLConnection
,您可以从(HttpURLConnection)url_kep.openConnection()
获得它。使用它,您可以设置标题,如User-Agent
,如果这是网站要求的标题,或其他标题,如Referer
,有时用于防止深度链接。
一旦您设置了所有的头和任何其他请求选项,您可以从客户端对象获得InputStream
,并将其传递给ImageIO
。
这个解决方案对我有用:
URLConnection openConnection = new URL("YOUR_IMAGE_URL").openConnection();
openConnection.addRequestProperty("User-Agent", "YOUR USER AGENT");
InputStream is = openConnection.getInputStream();
BufferedImage saveImage = ImageIO.read(is);
ImageIO.write(saveImage, "png", new File("PATH\TO\IMAGE\FILE.PNG"));