如何从java发布类似图像的图像数据

时间:2010-08-06 17:36:59

标签: java http forms post

嘿,我已经尝试过研究如何从java发布数据,似乎什么也没做我想做的事情。基本上,这是一个用于将图像上传到服务器的表单,我想要做的是将图像发布到同一服务器 - 但是来自java。它还需要具有正确的参数名称(无论表单输入的名称是什么)。我还想从这个方法返回响应。

令我感到困惑的是为什么这么难以找到,因为这似乎是非常基本的事情。

编辑----添加了代码

基于BalusC向我展示的一些东西,我创建了以下方法。它仍然不起作用,但它是我已经获得的最成功的东西(似乎发布了一些东西给其他服务器,并返回某种响应 - 我不确定我是否正确得到了响应):

EDIT2 ----基于BalusC的反馈添加到代码中

EDIT3 ----发布几乎可行的代码,但似乎有问题

 ....

 FileItemFactory factory = new DiskFileItemFactory();

 // Create a new file upload handler
 ServletFileUpload upload = new ServletFileUpload(factory);

 // Parse the request
 List<FileItem> items = upload.parseRequest(req);

 // Process the uploaded items
 for(FileItem item : items) {
     if( ! item.isFormField()) {
         String fieldName = item.getFieldName();
         String fileName = item.getName();
         String itemContentType = item.getContentType();
         boolean isInMemory = item.isInMemory();
         long sizeInBytes = item.getSize();

         // POST the file to the cdn uploader
         postDataRequestToUrl("<the host im uploading too>", "uploadedfile", fileName, item.get());

     } else {
         throw new RuntimeException("Not expecting any form fields");
     }
 }

....

// Post a request to specified URL. Get response as a string.
public static void postDataRequestToUrl(String url, String paramName, String fileName, byte[] requestFileData) throws IOException {
 URLConnection connection=null;

 try{
     String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value.
     String charset = "utf-8";

     connection = new URL(url).openConnection();
     connection.setDoOutput(true);
     connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
     PrintWriter writer = null;
     OutputStream output = null;
     try {
         output = connection.getOutputStream();
         writer = new PrintWriter(new OutputStreamWriter(output, charset), true); // true = autoFlush, important!

         // Send binary file.
         writer.println("--" + boundary);
         writer.println("Content-Disposition: form-data; name=\""+paramName+"\"; filename=\"" + fileName + "\"");
         writer.println("Content-Type: " + URLConnection.guessContentTypeFromName(fileName));
         writer.println("Content-Transfer-Encoding: binary");
         writer.println();

         output.write(requestFileData, 0, requestFileData.length);
         output.flush(); // Important! Output cannot be closed. Close of writer will close output as well.

         writer.println(); // Important! Indicates end of binary boundary.

         // End of multipart/form-data.
         writer.println("--" + boundary + "--");
     } finally {
         if (writer != null) writer.close();
         if (output != null) output.close();
     }

     //*  screw the response

     int status = ((HttpURLConnection) connection).getResponseCode();
     logger.info("Status: "+status);
     for (Map.Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {
         logger.info(header.getKey() + "=" + header.getValue());
     }

 } catch(Throwable e) {
     logger.info("Problem",e);
 } 

}

我可以看到这个代码上传文件,但只有之后我关闭了tomcat。这让我相信我正在打开某种联系。

这很有用!

2 个答案:

答案 0 :(得分:4)

您要使用的核心API是java.net.URLConnection。然而,这是相当低级和冗长的。您想要详细了解HTTP specifics并将其考虑在内(headers,等等)。你可以在这里找到a related question with lot of examples

更方便的HTTP客户端API是Apache Commons HttpComponents Client。您可以找到示例here


更新:根据您的更新:您应该将响应读作字符流,而不是二进制流,并尝试将字节转换为字符。这不会起作用。通过示例前往链接问题中的收集HTTP响应信息部分。这是它应该是这样的:

BufferedReader reader = null;
StringBuilder builder = new StringBuilder();

try {
    reader = new BufferedReader(new InputStreamReader(response, charset));
    for (String line; (line = reader.readLine()) != null;) {
        builder.append(line);
    }
} finally {
    if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
}

return builder.toString();

根据您的第二次更新,

更新2:。看看你如何继续贬低阅读/写作流,我认为现在是学习basic Java IO :)的时候了。嗯,这个部分也在链接问题中回答。您希望使用Apache Commons FileUpload来解析servlet中的multipart/form-data请求。如何使用它也在链接的问题中描述/链接。查看上传文件章节的底部。顺便说一句,内容长度标题将返回零,因为您没有明确地设置它(并且也不能没有在内存中缓冲整个请求)。


更新3:

  

我可以看到这个代码上传文件,但只有在我关闭tomcat之后。这让我相信我正在打开某种联系。

您需要关闭您将文件写入磁盘的OutputStream。再次阅读上面链接的基本Java IO教程。


答案 1 :(得分:1)

你有什么尝试?如果你谷歌搜索Http Post Java,会出现几十页 - 它们有什么问题?例如,这个http://www.devx.com/Java/Article/17679/1954看起来相当不错。