Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将图像从URL复制到HTTP URL_Java_Image_Http - Fatal编程技术网

Java 将图像从URL复制到HTTP 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

有人提供了一个S3预签名的URL,这样我就可以把我的图片上传到那个链接上。我所有的照片都在网站上。JAVA中是否有方法将图像URL复制到提供的新URL

我正在努力做到这一点。看起来有点过分了

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();
}