java - 通过 URLConnection 写入图像

标签 java sockets image-processing httpurlconnection urlconnection

我正在尝试通过 HttpURLConnection 写入图像。

我知道如何写文字,但我在尝试时遇到了真正的问题 写一张图片

使用ImageIO成功写入本地硬盘:

但我试图通过 ImageIO 在 url 上写入图像,但失败了

URL url = new URL(uploadURL);
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setRequestProperty("Content-Type", "multipart/form-data;
                                            boundary=" + boundary);
output = new DataOutputStream(connection.getOutputStream());
output.writeBytes("--" + boundary + "\r\n");
output.writeBytes("Content-Disposition: form-data; name=\"" + FIELD_NAME + "\";
                                            filename=\"" + fileName + "\"\r\n");
output.writeBytes("Content-Type: " + dataMimeType + "\r\n");
output.writeBytes("Content-Transfer-Encoding: binary\r\n\r\n");
ImageIO.write(image, imageType, output);

uploadURL 是服务器上一个 asp 页面的 url,它将使用“content-Disposition: 部分”中给定的文件名上传图像。

现在当我发送这个然后 asp 页面找到请求并找到文件的名称。但没有找到要上传的文件。

问题是,当 ImageIO 在 URL 上写入时,ImageIO 正在写入的文件的名称是什么,

所以请帮助我 ImageIO 将如何在 URLConnection 上写入图像以及我如何知道我必须在 asp 页面中使用以上传文件的文件的名称

感谢您花时间阅读这篇文章 迪利普·阿加瓦尔

最佳答案

首先,我认为您应该在写入图像后调用 io.flush(),然后调用 io.close()

第二种内容类型对我来说似乎很奇怪。看来您正在尝试提交实际上是图像的表单。我不知道你的 asp 期望什么,但通常当我编写应该通过 HTTP 传输文件的代码时,我会发送适当的内容类型,例如图片/jpeg.

例如,这是我从我编写并在当前工作中使用的一个小实用程序中提取的代码片段:

    URL url = new URL("http://localhost:8080/handler");
    HttpURLConnection con = (HttpURLConnection)url.openConnection();
    con.setDoInput(true);
    con.setDoOutput(true);
    con.setUseCaches(false);
    con.setRequestProperty("Content-Type", "image/jpeg");
    con.setRequestMethod("POST");
    InputStream in = new FileInputStream("c:/temp/poc/img/mytest2.jpg");
    OutputStream out = con.getOutputStream();
    copy(in, con.getOutputStream());
    out.flush();
    out.close();
    BufferedReader r = new BufferedReader(new  InputStreamReader(con.getInputStream()));


            // obviously it is not required to print the response. But you have
            // to call con.getInputStream(). The connection is really established only
            // when getInputStream() is called.
    System.out.println("Output:");
    for (String line = r.readLine(); line != null;  line = r.readLine()) {
        System.out.println(line);
    }

我在这里使用了从 Jakarta IO utils 中获取的方法 copy()。以下是引用代码:

protected static long copy(InputStream input, OutputStream output)
        throws IOException {
    byte[] buffer = new byte[12288]; // 12K
    long count = 0L;
    int n = 0;
    while (-1 != (n = input.read(buffer))) {
        output.write(buffer, 0, n);
        count += n;
    }
    return count;
}

显然,服务器端必须准备好直接从 POST 正文中读取图像内容。 我希望这会有所帮助。

关于java - 通过 URLConnection 写入图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4883379/

相关文章:

python - 如何从一张图像制作蒙版,然后将其转移到另一张图像?

java - 如何在 Java 中签署 AWS API 请求(适用于 Android 应用程序)

java - 从本地目录读取文本文件

java - 使用 JTable+focusLost() 错误显示数据

sockets - 如何在UDP套接字中使用select()从客户端到服务器进行读写

css - CSS中Invert()使用的颜色转换公式是什么?

java - 我试图使用这个 "If else"条件而不使用 "System...println"

c# - 使用 ProtocolType.IP 和 ProtocolType.Tcp 有什么区别

python - 如何使用 Python 解析由自定义协议(protocol)数据包组成的 TCP 流

c++ - 直接将选定的图像传递给另一个函数