HttpURLConnection构造请求体传文件

HttpURLConnection构造请求体传文件

在Java中,使用HttpURLConnection构造请求体传输文件,你需要做以下几步:

1、创建URL对象指向你想要请求的资源。

2、通过URL打开连接,转换为HttpURLConnection实例。

3、设置请求方法为POST。

4、设置请求头,包括Content-Type(通常为multipart/form-data)和边界值。

5、创建DataOutputStream来写入请求体。

6、构造每个表单项的数据,包括文件内容和文本字段。

7、读取服务器响应。

8、关闭连接。

以下是一个简化的示例代码:

复制代码
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
 
public class HttpUploadFileExample {
    public static void main(String[] args) throws IOException {
        String boundary = "*****";
        String endBoundary = "--" + boundary + "--";
        URL url = new URL("http://example.com");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
 
        try (
            OutputStream output = connection.getOutputStream();
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"), true);
        ) {
            // 添加文件
            File file = new File("/path/to/file");
            writer.append("--" + boundary).append(CRLF);
            writer.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"").append(CRLF);
            writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(file.getName())).append(CRLF);
            writer.append(CRLF).flush();
            Files.copy(file.toPath(), output);
            output.flush(); // 确保文件内容被发送
            writer.append(CRLF).flush(); // 写入换行,表示文件结束
 
            // 添加表单字段
            writer.append("--" + boundary).append(CRLF);
            writer.append("Content-Disposition: form-data; name=\"fieldName\"").append(CRLF);
            writer.append(CRLF).append("value").append(CRLF).flush();
 
            // 结束边界
            writer.append(endBoundary).append(CRLF).flush();
        }
 
        int responseCode = connection.getResponseCode();
        System.out.println("Response Code: " + responseCode);
        
        // 处理服务器响应
        ...
        
        connection.disconnect();
    }
}

CRLF是Carriage-Return Line-Feed的缩写,意思是回车换行,就是回车。



相关推荐
Y学院4 小时前
vue的组件通信
前端·javascript·vue.js
患得患失9494 小时前
【ThreeJs】【伪VR】用 Three.js 实现伪 VR 全景看房系统:低成本实现 3D 级交互体验
javascript·3d·vr
code小毛孩4 小时前
如何简单的并且又能大幅度降低任务队列的锁粒度、提高吞吐量?
java·jvm·数据库
你不是我我4 小时前
【Java开发日记】请介绍类加载过程,什么是双亲委派模型?
java·开发语言
牢七4 小时前
java10
java
teeeeeeemo4 小时前
Webpack 模块联邦(Module Federation)
开发语言·前端·javascript·笔记·webpack·node.js
阿挥的编程日记4 小时前
基于SpringBoot的高校(学生综合)服务平台的设计与实现
java·spring boot·后端·spring·mybatis
小霞在敲代码4 小时前
ArrayList - 数据结构 - 数组
java·索引
加洛斯6 小时前
Vue 知识篇(2):浅谈Vue中的DOM与VNode
前端·javascript·vue.js
一个小白开发6 小时前
ip获取城市省份信息
java·tcp/ip