如何从java发布类似表单的图像数据
嘿,我试着研究如何从java发布数据,但似乎什么都做不到。基本上,有一个将图像上传到服务器的表单,我想做的是将图像发布到同一个服务器上——但是来自java。它还需要有正确的参数名(无论表单输入的名称是什么)。我还想返回这个方法的响应 这让我很困惑,为什么这很难找到,因为这似乎是如此基本的东西 编辑----添加代码 基于BalusC向我展示的一些东西,我创建了以下方法。它仍然不起作用,但这是我迄今为止获得的最成功的东西(似乎向另一台服务器发布了一些东西,并返回了某种响应-我不确定我是否正确获得了响应): EDIT2----根据BalusC的反馈添加到代码中 EDIT3----发布代码,代码基本上是有效的,但似乎有一个问题:如何从java发布类似表单的图像数据,java,http,forms,post,Java,Http,Forms,Post,嘿,我试着研究如何从java发布数据,但似乎什么都做不到。基本上,有一个将图像上传到服务器的表单,我想做的是将图像发布到同一个服务器上——但是来自java。它还需要有正确的参数名(无论表单输入的名称是什么)。我还想返回这个方法的响应 这让我很困惑,为什么这很难找到,因为这似乎是如此基本的东西 编辑----添加代码 基于BalusC向我展示的一些东西,我创建了以下方法。它仍然不起作用,但这是我迄今为止获得的最成功的东西(似乎向另一台服务器发布了一些东西,并返回了某种响应-我不确定我是否正确获得了响
。。。。
FileItemFactory=new DiskFileItemFactory();
//创建新的文件上载处理程序
ServletFileUpload upload=新的ServletFileUpload(工厂);
//解析请求
列表项=upload.parseRequest(req);
//处理上载的项目
用于(文件项:项){
如果(!item.isFormField()){
字符串fieldName=item.getFieldName();
字符串文件名=item.getName();
String itemContentType=item.getContentType();
布尔值isInMemory=item.isInMemory();
long-sizeInBytes=item.getSize();
//将文件发布到cdn上载程序
postDataRequestToUrl(“,”uploadedfile“,”文件名,item.get());
}否则{
抛出新的RuntimeException(“不需要任何表单字段”);
}
}
....
//将请求发布到指定的URL。以字符串形式获取响应。
公共静态void postDataRequestToUrl(字符串url、字符串paramName、字符串文件名、字节[]requestFileData)引发IOException{
URLConnection=null;
试一试{
String boundary=Long.toHexString(System.currentTimeMillis());//只需生成一些唯一的随机值即可。
字符串charset=“utf-8”;
连接=新URL(URL).openConnection();
connection.setDoOutput(真);
connection.setRequestProperty(“内容类型”、“多部分/表单数据;边界=“+boundary”);
PrintWriter=null;
OutputStream输出=null;
试一试{
output=connection.getOutputStream();
writer=new PrintWriter(new OutputStreamWriter(output,charset),true);//true=autoFlush,重要提示!
//发送二进制文件。
writer.println(“-”+边界);
println(“内容处置:表单数据;名称=\”“+paramName+”\“文件名=\”“+filename+”\”);
writer.println(“内容类型:”+URLConnection.guessContentTypeFromName(文件名));
println(“内容传输编码:二进制”);
writer.println();
write(requestFileData,0,requestFileData.length);
output.flush();//重要!无法关闭输出。writer的关闭也将关闭输出。
writer.println();//重要!表示二进制边界的结束。
//多部分/表单数据的结尾。
writer.println(“-”+边界+“-”);
}最后{
如果(writer!=null)writer.close();
if(output!=null)output.close();
}
//*把反应搞砸
int status=((HttpURLConnection)connection.getResponseCode();
logger.info(“状态:+状态”);
for(Map.Entry头:connection.getHeaderFields().entrySet()){
logger.info(header.getKey()+“=”+header.getValue());
}
}捕获(可丢弃的e){
logger.info(“问题”,e);
}
}
我可以看到上传文件的代码,但只有在我关闭tomcat之后。这让我相信我留下了某种联系
这成功了 你试过什么?如果你用谷歌搜索Http Post Java,会出现几十个页面——它们有什么问题?例如,这一个看起来相当不错。您想要使用的核心API是。然而,这是相当低的级别和冗长的。您希望详细了解这些问题,并将其考虑在内(,等等)。你可以在这里找到 更方便的HTTP客户端API是。你可以找到一个例子
更新:根据您的更新:您应该将响应读取为字符流,而不是二进制流,并尝试将字节转换为字符。这是行不通的。通过示例,进入链接问题中的收集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:根据您的第二次更新。看到你如何继续关注阅读/写作流,我认为是时候学习:)好了,这部分也在链接的问题中得到了回答。您希望使用解析servlet中的
多部分/表单数据请求。如何使用它也在链接问题中进行了描述/链接。查看上传文件一章的底部。顺便说一句,content-length头将返回零,因为您没有显式地设置它(而且如果不在内存中缓冲整个请求,也不能这样做)
更新3:
我可以看到上传文件的代码,但只有在我关闭tomcat之后。这让我相信我留下了某种联系
您需要关闭将文件写入磁盘的OutputStream
。再次阅读上面链接的基本JavaIO教程
URL、URLConnection、DataOutputStream和DataInputStream的组合总是会返回FileNotFoundException。使用PostMethod添加带有setParameter的参数,我上传到的服务器说我没有传递文件(可能我传递的不是正确的参数名,或者缺少某种信息)。你似乎是对的
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();