Java 将图像从URL复制到HTTP URL
有人提供了一个S3预签名的URL,这样我就可以把我的图片上传到那个链接上。我所有的照片都在网站上。JAVA中是否有方法将图像URL复制到提供的新URL 我正在努力做到这一点。看起来有点过分了Java 将图像从URL复制到HTTP URL,java,image,http,Java,Image,Http,有人提供了一个S3预签名的URL,这样我就可以把我的图片上传到那个链接上。我所有的照片都在网站上。JAVA中是否有方法将图像URL复制到提供的新URL 我正在努力做到这一点。看起来有点过分了 try { // Get Image from URL URL urlGet = new URL("http://something.com/something.png"); BufferedImage image = ImageIO.r
try {
// Get Image from URL
URL urlGet = new URL("http://something.com/something.png");
BufferedImage image = ImageIO.read(urlGet);
//for png
ImageIO.write(image, "png",new File("/something.png"));
// for jpg
//ImageIO.write(image, "jpg",new File("/something.jpg"));
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(image, "png", outputStream);
outputStream.flush();
byte[] imageInBytes = outputStream.toByteArray();
outputStream.close();
URL url = new URL(putUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod(HttpMethod.PUT);
connection.setRequestProperty(HttpHeaders.CONTENT_TYPE, PNG_MIME_TYPE);
OutputStream stream = connection.getOutputStream();
try {
stream.write(imageInBytes);
} finally {
stream.close();
connection.disconnect();
}
switch (connection.getResponseCode()) {
case HttpURLConnection.HTTP_OK:
return "";
default:
break;
}
} catch (Exception e) {
log.error("Exception occured", e);
throw e;
}
当您可以保留原始文件的字节流时,转换为BuffereImage并返回副本是没有意义的。第一部分可以替换为简单调用,以从网站中提取字节:
byte[] imageInBytes = read(urlGet);
其中read()
是:
private static byte[] read(URL url) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream(16*1024);
try (var in = url.openStream()) {
in.transferTo(out);
}
return out.toByteArray();
}
如果您使用JDK11以后的版本,您可以尝试使用HttpClient类来获取和发布,例如,如果将其传递到urlGet.toURI()
,则与上面的操作相同:
“似乎有点过头了”是的。您不应使用ImageIO
复制文件(即使是图像文件)。只需使用普通的流/通道拷贝。使用内存或磁盘缓冲区可能有意义,尤其是对于大型文件。
private static byte[] read(URI uri) throws IOException, InterruptedException
{
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(uri).build();
var resp = client.send(request, BodyHandlers.ofByteArray());
return resp.body();
}