You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用REST Web Service上传CSV文件?附Java连接代码

基于现有REST API实现CSV文件上传

嘿,基于你现有的获取token的代码,我们可以轻松扩展出CSV文件上传功能。文件上传和你之前拿token的请求格式不一样,得用multipart/form-data类型(专门用来传文件的格式),下面一步步给你实现:

第一步:完善获取Access Token的方法

你的原代码是构建连接的逻辑,我们把它改成能直接返回有效token的方法——毕竟上传API肯定需要带token做身份认证:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;

public static String getAccessToken() throws Exception {
    String tokenUrl = AppPropertiesService.getProperty("URL_TOKEN");
    String username = AppPropertiesService.getProperty("USERNAME");
    String password = AppPropertiesService.getProperty("PASSWORD");
    String POST_PARAMS = "username=" + username + "&password=" + password + "&lang=fr&grant_type=password&client_id=apiclient";

    URL obj = new URL(tokenUrl);
    HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    con.setRequestMethod("POST");
    con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    con.setDoOutput(true);

    // 发送请求参数
    try (OutputStream os = con.getOutputStream()) {
        byte[] input = POST_PARAMS.getBytes(StandardCharsets.UTF_8);
        os.write(input, 0, input.length);
    }

    int responseCode = con.getResponseCode();
    if (responseCode == HttpURLConnection.HTTP_OK) {
        // 读取响应并解析出access_token
        try (BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()))) {
            String line;
            StringBuilder response = new StringBuilder();
            while ((line = in.readLine()) != null) {
                response.append(line);
            }
            // 用Jackson解析JSON响应,你需要引入Jackson依赖
            ObjectMapper mapper = new ObjectMapper();
            JsonNode rootNode = mapper.readTree(response.toString());
            return rootNode.get("access_token").asText();
        }
    } else {
        throw new Exception("获取token失败,响应码: " + responseCode);
    }
}

第二步:实现CSV文件上传方法

接下来写核心的上传逻辑,注意设置正确的请求头和构建multipart/form-data格式的请求体:

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;

public static void uploadCsvFile(String csvFilePath, String accessToken) throws Exception {
    String uploadUrl = AppPropertiesService.getProperty("UPLOAD_URL");
    File csvFile = new File(csvFilePath);
    
    // 先检查文件是否存在
    if (!csvFile.exists()) {
        throw new FileNotFoundException("找不到CSV文件: " + csvFilePath);
    }

    // 定义multipart的分隔符,随便找个不会出现在文件内容里的字符串就行
    String boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW";
    URL obj = new URL(uploadUrl);
    HttpURLConnection con = (HttpURLConnection) obj.openConnection();

    // 设置请求属性
    con.setRequestMethod("POST");
    con.setRequestProperty("Authorization", "Bearer " + accessToken); // 带token认证
    con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
    con.setDoOutput(true); // 允许写请求体
    con.setDoInput(true); // 允许读响应

    // 构建请求体并发送
    try (OutputStream outputStream = con.getOutputStream();
         PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8), true);
         FileInputStream fileInputStream = new FileInputStream(csvFile)) {

        // 写入文件字段的头部信息
        writer.append("--" + boundary).append("\r\n");
        writer.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + csvFile.getName() + "\"").append("\r\n");
        writer.append("Content-Type: text/csv").append("\r\n");
        writer.append("\r\n").flush();

        // 写入CSV文件的内容
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = fileInputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.flush();

        // 结束multipart的分隔符
        writer.append("\r\n").flush();
        writer.append("--" + boundary + "--").append("\r\n").flush();
    }

    // 处理上传响应
    int responseCode = con.getResponseCode();
    if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.CREATED) {
        try (BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()))) {
            String line;
            StringBuilder response = new StringBuilder();
            while ((line = in.readLine()) != null) {
                response.append(line);
            }
            System.out.println("上传成功!响应内容: " + response.toString());
        }
    } else {
        // 读取错误响应信息
        try (BufferedReader in = new BufferedReader(new InputStreamReader(con.getErrorStream()))) {
            String line;
            StringBuilder errorResponse = new StringBuilder();
            while ((line = in.readLine()) != null) {
                errorResponse.append(line);
            }
            throw new Exception("上传失败,响应码: " + responseCode + ", 错误信息: " + errorResponse.toString());
        }
    }
}

调用示例

最后把两个方法结合起来调用就行:

public static void main(String[] args) {
    try {
        // 先获取token
        String accessToken = getAccessToken();
        // 上传指定路径的CSV文件
        uploadCsvFile("/你的文件路径/xxx.csv", accessToken);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

一些需要注意的点

  • 如果你用Jackson解析token,需要在项目里引入Jackson依赖(比如Maven的话,添加下面的依赖):
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>
  • 记得在配置文件里添加UPLOAD_URL,值是实际的文件上传API地址
  • 确认上传API要求的文件字段名(示例里用的是file,如果API文档里要求别的名字,要修改name="file"这部分)
  • 字符编码统一用UTF-8,避免出现乱码问题
  • 异常处理可以根据你的业务需求进一步优化,比如添加重试机制、日志记录等

内容的提问来源于stack exchange,提问作者Mercer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:05:41