2015-10-09 15 views
7

Tôi đang cố gắng tải tệp lên máy chủ để tôi đang cố gắng sử dụng @RequestBody để lấy dữ liệu của tệp, nhưng tôi nhận được mã lỗi 415 trong khi cố gắng tải lên tệp.Tại sao chúng ta không thể lấy dữ liệu tập tin từ một RequestBody trong java?

Vì vậy, tôi đã googled (có giải pháp để tải lên một tệp) và phải biết rằng tôi không thể lấy dữ liệu tệp từ cơ thể yêu cầu. Vì vậy, tôi muốn biết lý do tại sao chúng tôi không thể truy cập dữ liệu tệp từ phần thân yêu cầu vì dữ liệu sẽ được gửi trong phần yêu cầu trong yêu cầu HTTP, vì vậy tôi muốn biết yêu cầu diễn ra như thế nào trong trường hợp tải lên tệp.

mã máy chủ của tôi trước đây:

@RequestMapping(value = "/upload",headers = "Content-Type=multipart/form-data", method = RequestMethod.POST) 
@ResponseBody 
public String upload(@RequestBody MultipartFile file) 
{ 
} 

Giải pháp:

@RequestMapping(value = "/upload",headers = "Content-Type=multipart/form-data", method = RequestMethod.POST) 
@ResponseBody 
public String upload(MultipartHttpServletRequest request) 
{ 
} 
+0

Hãy thử điều này .. @RequestMapping (value = "/ upload", tiêu đề = "Content-Type = multipart/form-data", method = RequestMethod.POST) @ResponseBody public String upload (@RequestParam ("tập tin") MultipartFile uploadFile) { } –

+0

tôi biết rằng nó sẽ làm việc tôi muốn biết tại sao chúng ta không thể lấy nó từ @RequestBody – Labeo

Trả lời

5

Về mặt kỹ thuật, bạn có thể viết HttpMessageConverter riêng của mình để phân tích cú pháp phần thân yêu cầu nhiều phần, nhưng bạn phải có một loại mục tiêu rất cụ thể có thể xử lý tất cả các phần.

Bạn sẽ nhận thấy từ javadoc của @RequestBody

Chú chỉ ra một số phương pháp nên được ràng buộc với cơ thể các yêu cầu web.

rằng ý định là liên kết toàn bộ phần thân yêu cầu với tham số phương pháp. Làm cách nào để bạn ràng buộc mọi phần của yêu cầu nhiều phần với một tham số? Một cái gì đó giống như một MultiValueMap<String, Object> (which is what FormHttpMessageConverter uses when writing a multipart request). Nhưng điều đó sẽ không hữu ích lắm bởi vì bạn phải kiểm tra loại của mỗi giá trị.

Điều này có ý nghĩa hơn khi nhà phát triển chỉ định chính xác những gì bạn cần. Đó là lý do tại sao @RequestParam@RequestPart khả dụng.

3

Bởi vì các tập tin không phải là cơ thể yêu cầu, họ là một phần của nó và không có built-in HttpMessageConverter mà có thể chuyển đổi yêu cầu đến một mảng của MultiPartFile. Thats lý do tại sao nó hoạt động @RequestParam("file") MultipartFile[] files

thay vì

@RequestBody MultipartFile file 

Hy vọng nó giúp.

Các vấn đề liên quan