java模拟post方式提交表单实现图片上传

jopen 11年前

模拟表单html如下:

 

<form action="up_result.jsp" method="post" enctype="multipart/form-data" name="form1" id="form1">
 
    <label>
  <input type="text" name="name" value="" />
  </label>
 
    <label>
  <input type="file" name="userfile" />
  </label>
 
  <label>
  <input type="submit" value="上传" />
  </label>
</form>

 

 

java代码如下:

import java.io.BufferedReader;    import java.io.DataInputStream;    import java.io.DataOutputStream;    import java.io.File;    import java.io.FileInputStream;    import java.io.InputStreamReader;    import java.io.OutputStream;    import java.net.HttpURLConnection;    import java.net.URL;    import java.util.HashMap;    import java.util.Iterator;    import java.util.Map;        import javax.activation.MimetypesFileTypeMap;        import net.sf.json.JSONArray;    import net.sf.json.JSONObject;        public class HttpPostUploadUtil {            /**        * @param args        */        public static void main(String[] args) {                        String filepath="E:\\ziliao\\0.jpg";                        String urlStr = "http://127.0.0.1:8080/minicms/up/up_result.jsp";                        Map<String, String> textMap = new HashMap<String, String>();                    textMap.put("name", "testname");                Map<String, String> fileMap = new HashMap<String, String>();                        fileMap.put("userfile", filepath);                        String ret = formUpload(urlStr, textMap, fileMap);                        System.out.println(ret);                        }                            /**        * 上传图片        *         * @param urlStr        * @param textMap        * @param fileMap        * @return        */        public static String formUpload(String urlStr, Map<String, String> textMap,                Map<String, String> fileMap) {            String res = "";            HttpURLConnection conn = null;            String BOUNDARY = "---------------------------123821742118716"; //boundary就是request头和上传文件内容的分隔符            try {                URL url = new URL(urlStr);                conn = (HttpURLConnection) url.openConnection();                conn.setConnectTimeout(5000);                conn.setReadTimeout(30000);                conn.setDoOutput(true);                conn.setDoInput(true);                conn.setUseCaches(false);                conn.setRequestMethod("POST");                conn.setRequestProperty("Connection", "Keep-Alive");                conn                        .setRequestProperty("User-Agent",                                "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");                conn.setRequestProperty("Content-Type",                        "multipart/form-data; boundary=" + BOUNDARY);                    OutputStream out = new DataOutputStream(conn.getOutputStream());                // text                if (textMap != null) {                    StringBuffer strBuf = new StringBuffer();                    Iterator iter = textMap.entrySet().iterator();                    while (iter.hasNext()) {                        Map.Entry entry = (Map.Entry) iter.next();                        String inputName = (String) entry.getKey();                        String inputValue = (String) entry.getValue();                        if (inputValue == null) {                            continue;                        }                        strBuf.append("\r\n").append("--").append(BOUNDARY).append(                                "\r\n");                        strBuf.append("Content-Disposition: form-data; name=\""                                + inputName + "\"\r\n\r\n");                        strBuf.append(inputValue);                    }                    out.write(strBuf.toString().getBytes());                }                    // file                if (fileMap != null) {                    Iterator iter = fileMap.entrySet().iterator();                    while (iter.hasNext()) {                        Map.Entry entry = (Map.Entry) iter.next();                        String inputName = (String) entry.getKey();                        String inputValue = (String) entry.getValue();                        if (inputValue == null) {                            continue;                        }                        File file = new File(inputValue);                        String filename = file.getName();                        String contentType = new MimetypesFileTypeMap()                                .getContentType(file);                        if (filename.endsWith(".png")) {                            contentType = "image/png";                        }                        if (contentType == null || contentType.equals("")) {                            contentType = "application/octet-stream";                        }                            StringBuffer strBuf = new StringBuffer();                        strBuf.append("\r\n").append("--").append(BOUNDARY).append(                                "\r\n");                        strBuf.append("Content-Disposition: form-data; name=\""                                + inputName + "\"; filename=\"" + filename                                + "\"\r\n");                        strBuf.append("Content-Type:" + contentType + "\r\n\r\n");                            out.write(strBuf.toString().getBytes());                            DataInputStream in = new DataInputStream(                                new FileInputStream(file));                        int bytes = 0;                        byte[] bufferOut = new byte[1024];                        while ((bytes = in.read(bufferOut)) != -1) {                            out.write(bufferOut, 0, bytes);                        }                        in.close();                    }                }                    byte[] endData = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();                out.write(endData);                out.flush();                out.close();                    // 读取返回数据                StringBuffer strBuf = new StringBuffer();                BufferedReader reader = new BufferedReader(new InputStreamReader(                        conn.getInputStream()));                String line = null;                while ((line = reader.readLine()) != null) {                    strBuf.append(line).append("\n");                }                res = strBuf.toString();                reader.close();                reader = null;            } catch (Exception e) {                System.out.println("发送POST请求出错。" + urlStr);                e.printStackTrace();            } finally {                if (conn != null) {                    conn.disconnect();                    conn = null;                }            }            return res;        }        }