java 模拟form表单提交数据可以文件上传

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

public class HttpPostEmulator {
    // 每个post参数之间的分隔。随意设定,只要不会和其他的字符串重复即可。
    private static final String BOUNDARY = "----------HV2ymHFg03ehbqgZCaKO6jyH";

    public String sendHttpPostRequest(String serverUrl,
                                      ArrayList<FormFieldKeyValuePair> generalFormFields,
                                      ArrayList<UploadFileItem> filesToBeUploaded) throws Exception {

        // 向服务器发送post请求

        URL url = new URL(serverUrl);

        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        // 发送POST请求必须设置如下两行

        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setUseCaches(false);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("x-token","#{token}");
        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setRequestProperty("Charset", "UTF-8");
        connection.setRequestProperty("Content-Type",
                "multipart/form-data; boundary=" + BOUNDARY);

        // 头

        String boundary = BOUNDARY;

        // 传输内容

        StringBuffer contentBody = new StringBuffer("--" + BOUNDARY);

        // 尾

        String endBoundary = "\r\n--" + boundary + "--\r\n";

        OutputStream out = connection.getOutputStream();

        // 1. 处理文字形式的POST请求

        for (FormFieldKeyValuePair ffkvp : generalFormFields) {
            contentBody.append("\r\n")

                    .append("Content-Disposition: form-data; name=\"")

                    .append(ffkvp.getKey() + "\"")

                    .append("\r\n")

                    .append("\r\n")

                    .append(ffkvp.getValue())

                    .append("\r\n")

                    .append("--")

                    .append(boundary);

        }
        System.out.println(contentBody.toString());
        String boundaryMessage1 = contentBody.toString();

        out.write(boundaryMessage1.getBytes("utf-8"));

        // 2. 处理文件上传

        for (UploadFileItem ufi : filesToBeUploaded) {

            contentBody = new StringBuffer();

            contentBody.append("\r\n")

                    .append("Content-Disposition:form-data; name=\"")

                    .append(ufi.getFormFieldName() + "\"; ") // form中field的名称

                    .append("filename=\"")

                    .append(ufi.getFileName() + "\"") // 上传文件的文件名,包括目录

                    .append("\r\n")

                    .append("Content-Type:application/octet-stream")

                    .append("\r\n\r\n");

            String boundaryMessage2 = contentBody.toString();

            out.write(boundaryMessage2.getBytes("utf-8"));

            // 开始真正向服务器写文件

            File file = new File(ufi.getFileName());
            DataInputStream dis = new DataInputStream(new FileInputStream(file));
            int bytes = 0;
            byte[] bufferOut = new byte[(int) file.length()];
            bytes = dis.read(bufferOut);

            out.write(bufferOut, 0, bytes);

            dis.close();

        }

    

        // 3. 写结尾

        out.write(endBoundary.getBytes("utf-8"));

        out.flush();

        out.close();

        // 4. 从服务器获得回答的内容

        String strLine = "";

        String strResponse = "";

        InputStream in = null;
        try {
            in = connection.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        BufferedReader reader = new BufferedReader(new InputStreamReader(in));

        while ((strLine = reader.readLine()) != null) {

            strResponse += strLine + "\n";

        }


        return strResponse;

    }

    public static void main(String[] args) {

        String url="#{url}";
        //正常参数
        ArrayList<FormFieldKeyValuePair> textParam= new ArrayList<>();
        textParam.add(new FormFieldKeyValuePair("site","attachment"));
        textParam.add(new FormFieldKeyValuePair("fileName","23.jpeg"));
        //文件参数
        ArrayList<UploadFileItem> fileParam= new ArrayList<>();
        fileParam.add(new UploadFileItem("file","C:\\Users\\USER\\Desktop\\222.jpeg"));
        HttpPostEmulator httpPostEmulator= new HttpPostEmulator();
        try {
            System.out.println(httpPostEmulator.sendHttpPostRequest(url,textParam,fileParam));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值