Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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发布类似表单的图像数据_Java_Http_Forms_Post - Fatal编程技术网

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

如何从java发布类似表单的图像数据,java,http,forms,post,Java,Http,Forms,Post,嘿,我试着研究如何从java发布数据,但似乎什么都做不到。基本上,有一个将图像上传到服务器的表单,我想做的是将图像发布到同一个服务器上——但是来自java。它还需要有正确的参数名(无论表单输入的名称是什么)。我还想返回这个方法的响应 这让我很困惑,为什么这很难找到,因为这似乎是如此基本的东西 编辑----添加代码 基于BalusC向我展示的一些东西,我创建了以下方法。它仍然不起作用,但这是我迄今为止获得的最成功的东西(似乎向另一台服务器发布了一些东西,并返回了某种响应-我不确定我是否正确获得了响

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

这让我很困惑,为什么这很难找到,因为这似乎是如此基本的东西

编辑----添加代码

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

EDIT2----根据BalusC的反馈添加到代码中

EDIT3----发布代码,代码基本上是有效的,但似乎有一个问题:

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