转自:http://www.linuxidc.com/Linux/2011-08/41944.htm
问题:
Android应用中,当遇到填写用户信息、发表评论等操作,不可避免会遇到“form表单操作”(类似web form操作)上传图片的功能。
在这种情况下,使用Android的HTTPConnection/ ApacheHTTP 通过POST 和GET的方式就实现不了。
解决方法:
Android客户端通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
publicclassUploadImage{
- Stringmultipart_form_data="multipart/form-data";
- StringtwoHyphens="--";
- Stringboundary="****************fD4fH3gL0hK7aI6";
- StringlineEnd=System.getProperty("line.separator");
-
-
-
-
-
-
-
-
-
-
-
-
privatevoidaddImageContent(Image[]files,DataOutputStreamoutput){
-
for(Imagefile:files){
- StringBuildersplit=newStringBuilder();
- split.append(twoHyphens+boundary+lineEnd);
- split.append("Content-Disposition:form-data;name=\""+file.getFormName()+"\";filename=\""+file.getFileName()+"\""+lineEnd);
- split.append("Content-Type:"+file.getContentType()+lineEnd);
- split.append(lineEnd);
-
try{
- output.writeBytes(split.toString());
- output.write(file.getData(),0,file.getData().length);
- output.writeBytes(lineEnd);
- }catch(IOExceptione){
-
thrownewRuntimeException(e);
- }
- }
- }
-
-
-
-
-
-
-
-
-
privatevoidaddFormField(Set<Map.Entry<Object,Object>>params,DataOutputStreamoutput){
- StringBuildersb=newStringBuilder();
-
for(Map.Entry<Object,Object>param:params){
- sb.append(twoHyphens+boundary+lineEnd);
- sb.append("Content-Disposition:form-data;name=\""+param.getKey()+"\""+lineEnd);
- sb.append(lineEnd);
- sb.append(param.getValue()+lineEnd);
- }
-
try{
- output.writeBytes(sb.toString());
- }catch(IOExceptione){
-
thrownewRuntimeException(e);
- }
- }
-
-
-
-
-
-
-
-
publicStringpost(StringactionUrl,Set<Map.Entry<Object,Object>>params,Image[]files){
- HttpURLConnectionconn=null;
- DataOutputStreamoutput=null;
- BufferedReaderinput=null;
-
try{
- URLurl=newURL(actionUrl);
- conn=(HttpURLConnection)url.openConnection();
- conn.setConnectTimeout(120000);
- conn.setDoInput(true);
- conn.setDoOutput(true);
- conn.setUseCaches(false);
- conn.setRequestMethod("POST");
- conn.setRequestProperty("Connection","keep-alive");
- conn.setRequestProperty("Content-Type",multipart_form_data+";boundary="+boundary);
-
- conn.connect();
- output=newDataOutputStream(conn.getOutputStream());
-
- addImageContent(files,output);
-
- addFormField(params,output);
-
- output.writeBytes(twoHyphens+boundary+twoHyphens+lineEnd);
- output.flush();
-
-
intcode=conn.getResponseCode();
-
if(code!=200){
-
thrownewRuntimeException("请求‘"+actionUrl+"’失败!");
- }
-
- input=newBufferedReader(newInputStreamReader(conn.getInputStream()));
- StringBuilderresponse=newStringBuilder();
- StringoneLine;
-
while((oneLine=input.readLine())!=null){
- response.append(oneLine+lineEnd);
- }
-
-
returnresponse.toString();
- }catch(IOExceptione){
-
thrownewRuntimeException(e);
- }finally{
-
try{
-
if(output!=null){
- output.close();
- }
-
if(input!=null){
- input.close();
- }
- }catch(IOExceptione){
-
thrownewRuntimeException(e);
- }
-
-
if(conn!=null){
- conn.disconnect();
- }
- }
- }
-
-
publicstaticvoidmain(String[]args){
-
try{
- Stringresponse="";
-
- BufferedReaderin=newBufferedReader(newFileReader("config/actionUrl.properties"));
- StringactionUrl=in.readLine();
-
- PropertiesformDataParams=newProperties();
- formDataParams.load(newFileInputStream(newFile("config/formDataParams.properties")));
- Set<Map.Entry<Object,Object>>params=formDataParams.entrySet();
-
- PropertiesimageParams=newProperties();
- imageParams.load(newFileInputStream(newFile("config/imageParams.properties")));
- Set<Map.Entry<Object,Object>>images=imageParams.entrySet();
- Image[]files=newImage[images.size()];
-
inti=0;
-
for(Map.Entry<Object,Object>image:images){
- Imagefile=newImage(image.getValue().toString(),image.getKey().toString());
- files[i++]=file;
- }
-
-
-
-
- response=newUploadImage().post(actionUrl,params,files);
- System.out.println("返回结果:"+response);
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
分享到:
相关推荐
使用indy自带的idhttp控件,用form表单(multipart/form-data)形式上传文件(图片,视频等)
c#没有现成的multipart/form-data库,自己封的一个demo供参考。
用C语言实现multipart/form-data文件上传,没有用到curl之类的库。之前做个小的日志上传程序写的。
使用c#实现的HttpClient拼接multipart/form-data形式参数post提交数据,包含图片内容,有需要的可以下载,希望能帮到有需要的人,
c#模拟post发送json和multipart/form-data格式
解决上传文件enctype= multipart/form-data 时无法传递其他参数的问题,以及项目全局编码问题。用的插件是commons io + commons fileupload
NULL 博文链接:https://bertlee.iteye.com/blog/1134576
解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法 ?
WebAPI通过multipart/form-data方式同时上传文件以及数据包含客户端上传例子
c#下post 发送 multipart/form-data和JSON数据
servlet上传 enctype="multipart/form-data" servlet上传 enctype="multipart/form-data
c#post multipart/form-data和JSON数据
<form method="post" ENCTYPE="multipart/form-data"> file类型职务的普通参数传递到后台问题解决
解决java enctype multipart form-data文件上传传值问题 不使用jspsmartupload组件 可以轻轻松松 解决传值问题
该程序是 multipart/form-data 远程dos利用程序,一台电脑直接打崩一台服务器!程序只为便于检测你服务器漏洞,切勿非法使用。 检测效果不明显的话,多运行几个实例将会增强攻击力度。
解决当FORM的ENCTYPE="multipart/form-data" 时action方法或者控制层用request.getParameter()获取不到值的方法 ?
今天小编就为大家分享一篇python处理multipart/form-data的请求方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
NULL 博文链接:https://wese345.iteye.com/blog/686108