Java客户端服务端上传接收文件实现详解
本文针对Java客户端与服务端之间的文件上传与接收过程进行详细讲解,包括服务端搭建、客户端实现、文件上传与接收等方面。
服务端搭建
服务端主要负责接收文件并进行处理。以下是搭建服务端的步骤:
- 创建一个Java项目
- 引入
spring-boot-starter-web
依赖(以Spring Boot为例) - 创建文件上传接口,以
@PostMapping
注解的方式实现文件接收 - 在文件上传接口中,使用
MultipartFile
对象获取上传文件的相关信息,如文件名、大小等。
以下是示例代码:
@RestController
public class FileController {
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) throws IOException {
String filename = file.getOriginalFilename();
System.out.println("接收到文件:" + filename);
// 文件保存操作
file.transferTo(new File("D:/upload/" + filename));
return "文件上传成功!";
}
}
在上述代码中,@RequestParam
注解中的file
表示上传文件在表单中的name属性,通过MultipartFile
对象获取上传文件的相关信息。之后将文件保存到指定的存储路径。
客户端实现
客户端主要负责将本地文件发送至服务端。以下是客户端实现的步骤:
- 引入
spring-boot-starter-web
依赖(以Spring Boot为例) - 创建
RestTemplate
对象 - 创建一个
MultiValueMap
对象,并将需要上传的文件以ByteArrayResource
类型的方式添加到其中 - 构造一个
HttpHeaders
对象,设置请求头 - 执行POST请求,并将
MultiValueMap
和HttpHeaders
对象作为请求体参数
以下是示例代码:
public class FileUploadClient {
public static void main(String[] args) throws IOException {
// URL
String url = "http://localhost:8080/upload";
// 文件路径
String filepath = "D:/upload/test.txt";
RestTemplate restTemplate = new RestTemplate();
FileSystemResource fileResource = new FileSystemResource(filepath);
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
param.add("file", fileResource);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(param, headers);
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
System.out.println(response.getBody());
}
}
在上述代码中,使用RestTemplate
对象执行POST请求,并将文件以ByteArrayResource
类型的方式添加到MultiValueMap
对象中。可以通过设置HttpHeaders
对象的Content-Type
属性为MULTIPART_FORM_DATA
来设置请求头,最后将MultiValueMap
和HttpHeaders
对象作为请求体参数进行POST请求。
文件上传与接收
通过上述服务端与客户端的实现,可以实现文件的上传与接收。客户端将本地文件以POST方式上传到服务端,服务端接收后进行相应处理。
以下是文件上传与接收的示例代码:
public class FileUploadClient {
public static void main(String[] args) throws IOException {
// URL
String url = "http://localhost:8080/upload";
// 文件路径
String filepath = "D:/upload/test.txt";
RestTemplate restTemplate = new RestTemplate();
FileSystemResource fileResource = new FileSystemResource(filepath);
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
param.add("file", fileResource);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(param, headers);
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
System.out.println(response.getBody());
}
}
@RestController
public class FileController {
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) throws IOException {
String filename = file.getOriginalFilename();
System.out.println("接收到文件:" + filename);
// 文件保存操作
file.transferTo(new File("D:/upload/" + filename));
return "文件上传成功!";
}
}
上述示例代码中,客户端将本地D:/upload/test.txt
文件上传到服务端的/upload
路径中,服务端接收到文件后将其保存至D:/upload/
目录下。
另外一个示例,可以参考以下的代码:
public class FileUploadClient {
private static final int BUFFER_SIZE = 1024;
public static void main(String[] args) throws IOException {
String filepath = "D:/upload/test.txt";
String url = "http://localhost:8080/upload";
HttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost(url);
File file = new File(filepath);
FileEntity entity = new FileEntity(file);
entity.setContentType("multipart/form-data");
httppost.setEntity(entity);
HttpResponse response = httpclient.execute(httppost);
HttpEntity responseEntity = response.getEntity();
System.out.println(EntityUtils.toString(responseEntity));
}
}
@RestController
public class FileController {
@PostMapping("/upload")
public String upload(HttpServletRequest request) throws Exception {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iterator = items.iterator();
while (iterator.hasNext()) {
FileItem item = iterator.next();
if (!item.isFormField()) {
String fileName = StringUtils.cleanPath(item.getName());
String uploadPath = "D:/upload/";
Path path = Paths.get(uploadPath + fileName);
Files.copy(item.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);
return "文件上传成功!";
}
}
}
return "文件上传失败!";
}
}
在上述示例代码中,客户端通过HttpClient
对象执行POST请求,并将文件以FileEntity
类型的方式添加到请求体中。服务端利用Apache Commons FileUpload
工具处理请求中的文件,并保存至指定目录下。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java客户端服务端上传接收文件实现详解 - Python技术站