如何使用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
相关产品推荐
相关产品推荐

