嘿,我已经尝试过研究如何从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。这让我相信我正在打开某种联系。
这很有用!
答案 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看起来相当不错。