java 模拟html表单(form)提交数据 包含多文件 上传 表单提交 for j2me j2s

我们先来看一下用html写简单的表单(form)是什么样的,如下:

[xhtml]  view plain copy
  1. <html>  
  2.     <head>  
  3.         <title>上传文件测试页面</title>  
  4.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>  
  5.     </head>  
  6.     <body>  
  7.     <form method="post" action="http://your_address" enctype="multipart/form-data">  
  8.         <input type='hidden' id="do" name="do" value="justDoIt"/>       
  9.         <fieldset>  
  10.             <label>          名称:</label><input type='text' id='myname' name='myname' size='35' maxlength='255'><br/>  
  11.             <label>上传文件:</label><input type='file' id='uploadFile' name="uploadFile" size='35' maxlength='255'><br/>  
  12.             <label>描述:</label><br/>  
  13.             <textarea rows="5" cols="100" id='description' name='description' >  
  14. </fieldset>  
  15.         <fieldset>  
  16.             <input type='submit' id='submit'/>  
  17.             <input type='reset' id='reset'/>  
  18.         </fieldset>                 
  19.     </form>  
  20.     </body>  
  21. </html>  

假设服务器都做好的情况下,我们点击"提交",就能完成文件上传工做。

需求:

用java 模拟html表单(form)提交数据 包含多文件 上传 表单提交。

不用多说,码农的风格直接上代码,说明全在代码上了,用法参见main方法s

[java]  view plain copy
  1. import java.io.ByteArrayOutputStream;  
  2. import java.io.DataInputStream;  
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.InputStream;  
  8. import java.io.OutputStream;  
  9. import java.util.ArrayList;  
  10. import java.util.Enumeration;  
  11. import java.util.Hashtable;  
  12. import java.util.List;  
  13.   
  14. import java.net.HttpURLConnection;  
  15. import java.net.URL;  
  16.   
  17. /** 
  18.  * 模拟html表单提交数据,喜欢研究的同学可以把代码优化一下。 
  19.  */  
  20. public class HttpMultipartRequest {  
  21.     //每个post参数之间的分隔  
  22.     static final String BOUNDARY = "----------V2ymHFg03ehbqgZCaKO6jy";  
  23.   
  24.     public static void main(String[] args) {  
  25.           
  26.         List<String[]> stringParams = new ArrayList<String[]>();  
  27.         stringParams.add(new String[]{"do", "justDoIt"});  
  28.         stringParams.add(new String[]{"myname", "aa我是一个测试cc123"});  
  29.         stringParams.add(new String[]{"description", "bb我是码农我是一个测试我是一个测试cc567"});  
  30.           
  31.         List<String[]> fileParams = new ArrayList<String[]>();  
  32.         fileParams.add(new String[]{"uploadFile", "我是码农的一个测试.zip", "application/zip", "D://我是一个测试.zip"});  
  33.         HttpMultipartRequest req = new HttpMultipartRequest("http://your_address", stringParams, fileParams);  
  34.         try {  
  35.             byte[] response = req.sendPost();  
  36.             System.out.println(new String(response));  
  37.         } catch (Exception e) {  
  38.             e.printStackTrace();  
  39.         }  
  40.   
  41.     }  
  42.   
  43.     // 连接的地址  
  44.     private String urlStr;  
  45.     // 文字post项集 strParams 1:key 2:value  
  46.     private List<String[]> strParams;  
  47.     // 文件的post项集 fileParams 1:fileField, 2.fileName, 3.fileType, 4.filePath  
  48.     private List<String[]> fileParams;  
  49.   
  50.     /** 
  51.      * 建立一个request连接 
  52.      * @param urlStr 
  53.      * @param strParams 1:key 2:value 
  54.      * @param fileParams 1:fileField, 2.fileName, 3.fileType, 4.filePath 
  55.      */  
  56.     public HttpMultipartRequest(String urlStr, List<String[]> strParams, List<String[]> fileParams) {  
  57.         this.urlStr = urlStr;  
  58.         this.strParams = strParams;  
  59.         this.fileParams = fileParams;  
  60.   
  61.     }  
  62.   
  63.     /** 
  64.      * 向服务器发送post请求 
  65.      * @return byte[] 
  66.      * @throws Exception 
  67.      */  
  68.     public byte[] sendPost() throws Exception {  
  69.         //http连接器  
  70.         HttpURLConnection hc = null;  
  71.         //byte输出流,用来读取服务器返回的信息  
  72.         ByteArrayOutputStream bos = null;  
  73.         //输入流,用来读取服务器返回的信息  
  74.         InputStream is = null;  
  75.         //保存服务器返回的信息的byte数组  
  76.         byte[] res = null;  
  77.   
  78.         try {  
  79.             URL url = new URL(urlStr);  
  80.             hc = (HttpURLConnection) url.openConnection();  
  81.   
  82.             hc.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);  
  83.             hc.setRequestProperty("Charsert", "UTF-8");  
  84.             // 发送POST请求必须设置如下两行  
  85.             hc.setDoOutput(true);  
  86.             hc.setDoInput(true);  
  87.             hc.setUseCaches(false);  
  88.             hc.setRequestMethod("POST");  
  89.   
  90.             OutputStream dout = hc.getOutputStream();  
  91.             ////1.先写文字形式的post流  
  92.             //头  
  93.             String boundary = BOUNDARY;  
  94.             //中  
  95.             StringBuffer resSB = new StringBuffer("/r/n");  
  96.             //尾  
  97.             String endBoundary = "/r/n--" + boundary + "--/r/n";  
  98.             //strParams 1:key 2:value  
  99.             if(strParams != null){  
  100.                 for(String[] parsm : strParams){  
  101.                     String key = parsm[0];  
  102.                     String value = parsm[1];  
  103.                     resSB.append("Content-Disposition: form-data; name=/"").append(key).append("/"/r/n").append("/r/n").append(  
  104.                             value).append("/r/n").append("--").append(boundary).append("/r/n");  
  105.                 }  
  106.             }  
  107.             String boundaryMessage = resSB.toString();  
  108.               
  109.             //写出流  
  110.             dout.write( ("--"+boundary+boundaryMessage).getBytes("utf-8") );  
  111.               
  112.             //2.再写文件开式的post流  
  113.             //fileParams 1:fileField, 2.fileName, 3.fileType, 4.filePath  
  114.             resSB = new StringBuffer();  
  115.             if(fileParams != null){  
  116.                 for(int i=0, num=fileParams.size(); i<num; i++){  
  117.                     String[] parsm = fileParams.get(i);  
  118.                     String fileField = parsm[0];  
  119.                     String fileName = parsm[1];  
  120.                     String fileType = parsm[2];  
  121.                     String filePath = parsm[3];  
  122.                       
  123.                     resSB.append("Content-Disposition: form-data; name=/"").append(fileField).append("/"; filename=/"").append(  
  124.                             fileName).append("/"/r/n").append("Content-Type: ").append(fileType).append("/r/n/r/n");  
  125.                       
  126.                     dout.write( resSB.toString().getBytes("utf-8") );  
  127.                       
  128.                     //开始写文件  
  129.                     File file = new File(filePath);  
  130.                     DataInputStream in = new DataInputStream(new FileInputStream(file));  
  131.                     int bytes = 0;  
  132.                     byte[] bufferOut = new byte[1024 * 5];  
  133.                     while ((bytes = in.read(bufferOut)) != -1) {  
  134.                         dout.write(bufferOut, 0, bytes);  
  135.                     }  
  136.                       
  137.                     if(i<num-1){  
  138.                         dout.write( endBoundary.getBytes("utf-8") );  
  139.                     }  
  140.                       
  141.                     in.close();  
  142.                 }  
  143.                   
  144.             }  
  145.               
  146.             //3.最后写结尾  
  147.             dout.write( endBoundary.getBytes("utf-8") );  
  148.               
  149.             dout.close();  
  150.               
  151.             int ch;  
  152.   
  153.             is = hc.getInputStream();  
  154.               
  155.             bos = new ByteArrayOutputStream();  
  156.             while ((ch = is.read()) != -1) {  
  157.                 bos.write(ch);  
  158.             }  
  159.             res = bos.toByteArray();  
  160.         } catch (Exception e) {  
  161.             e.printStackTrace();  
  162.         } finally {  
  163.             try {  
  164.                 if (bos != null)  
  165.                     bos.close();  
  166.   
  167.                 if (is != null)  
  168.                     is.close();  
  169.   
  170.             } catch (Exception e2) {  
  171.                 e2.printStackTrace();  
  172.             }  
  173.         }  
  174.         return res;  
  175.     }  
  176.   
  177.   
  178. }  



你可能感兴趣的:(java 模拟html表单(form)提交数据 包含多文件 上传 表单提交 for j2me j2s)