HTTP POST 发送File 并设置请求头

package com.simpro.util;

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;

public class QdfsFaceToPostHttpHeader {
  public static void main(String[] args) {
    String fileurl = "C:\\Users\\wz_xiaomingbai\\Pictures\\kefu.jpg";
    uploadFile(fileurl);
  }
  public static void uploadFile(String fileName) {  
    try {  

        // 换行符  
        final String newLine = "\r\n";  
        final String boundaryPrefix = "--";  
        // 定义数据分隔线  
        String BOUNDARY = "========7d4a6d158c9";  
        // 服务器的域名  
        URL url = new URL("http://123.127.2.222:22111/search");  
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
        // 设置为POST
        conn.setRequestMethod("POST");  
        // 发送POST请求必须设置如下两行  
        conn.setDoOutput(true);  
        conn.setDoInput(true);  
        conn.setUseCaches(false);  
        // 设置请求头参数  
        conn.setRequestProperty("token", "e1cd399582e14c7eb722f3509f115964");  
        //conn.setRequestProperty("connection", "Keep-Alive");  
        //conn.setRequestProperty("Charsert", "UTF-8");  
        conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);  

        OutputStream out = new DataOutputStream(conn.getOutputStream());  

        // 上传文件  
        File file = new File(fileName);  
        StringBuilder sb = new StringBuilder();  
        sb.append(boundaryPrefix);  
        sb.append(BOUNDARY);  
        sb.append(newLine);  
        // 文件参数,photo参数名可以随意修改  
        sb.append("Content-Disposition: form-data;name=\"file\";filename=\"" + fileName  
                + "\"" + newLine);  
        sb.append("Content-Type:image/jpeg");  
        // 参数头设置完以后需要两个换行,然后才是参数内容  
        sb.append(newLine);  
        sb.append(newLine);  

        // 将参数头的数据写入到输出流中  
        out.write(sb.toString().getBytes());  

        // 数据输入流,用于读取文件数据  
        DataInputStream in = new DataInputStream(new FileInputStream(  
                file));  
        byte[] bufferOut = new byte[1024];  
        int bytes = 0;  
        // 每次读1KB数据,并且将文件数据写入到输出流中  
        while ((bytes = in.read(bufferOut)) != -1) { 
            out.write(bufferOut, 0, bytes);  
        }  
        // 最后添加换行  
        out.write(newLine.getBytes());  
        in.close();  

        // 定义最后数据分隔线,即--加上BOUNDARY再加上--。  
        byte[] end_data = (newLine + boundaryPrefix + BOUNDARY + boundaryPrefix + newLine)  
                .getBytes();  
        // 写上结尾标识  
        out.write(end_data);  
        out.flush();  
        out.close();  

        // 定义BufferedReader输入流来读取URL的响应  
        BufferedReader reader = new BufferedReader(new InputStreamReader(  
                conn.getInputStream()));  
        String line = null;  
        while ((line = reader.readLine()) != null) {  
            System.out.println(line);  
        }  

    } catch (Exception e) {  
        System.out.println("发送POST请求出现异常!" + e);  
        e.printStackTrace();  
    }  
}
}

 

在Java中,如果你想要通过POST请求发送文件,通常会使用`Content-Type: multipart/form-data`来发送表单数据,包括文件。这种情况下,需要在请求中包含边界(boundary)字符串,用于分隔不同的表单项,包括文件。 如果你使用的是Java的`HttpURLConnection`,可以这样设置: ```java String boundary = "===" + System.currentTimeMillis() + "==="; urlConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); try(OutputStream os = urlConn.getOutputStream()) { os.write(("--" + boundary + "\r\n").getBytes()); os.write("Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"\r\n".getBytes()); os.write("Content-Type: " + contentType + "\r\n\r\n".getBytes()); os.write(fileData); os.write(("\r\n--" + boundary + "--\r\n").getBytes()); } ``` 如果你使用的是Apache HttpClient,可以这样做: ```java HttpClient client = HttpClientBuilder.create().build(); HttpPost httpPost = new HttpPost(url); FileBody bin = new FileBody(file); StringBody comment = new StringBody("File comment"); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addPart("file", bin); builder.addPart("comment", comment); HttpEntity multipart = builder.build(); httpPost.setEntity(multipart); HttpResponse response = client.execute(httpPost); ``` 如果你使用的是Spring框架的`RestTemplate`,可以这样做: ```java MultiValueMap<String, Object> body = new LinkedMultiValueMap<>(); body.add("file", new FileSystemResource(file)); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, getHeaders()); ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); ``` 在这里`getHeaders()`方法需要实现,确保设置了正确的`Content-Type`以及`boundary`。 需要注意的是,实际开发中,发送文件的代码会根据具体的需求和使用的库有所不同,上述代码仅供参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值