Đang cố gắng tải lên tệp lớn bằng API tải lên tệp Apache Commons 'trực tuyến'.SpringBoot: Tải lên tệp tải lên lớn bằng cách sử dụng Apache Commons FileUpload
Lý do tôi đang sử dụng Trình tải lên tệp của Apache Commons chứ không phải trình tải lên Spring Multipart mặc định là nó không thành công khi chúng tôi tải lên kích thước tệp rất lớn (~ 2GB). Tôi làm việc trên một ứng dụng GIS, nơi các tệp tải lên như vậy khá phổ biến.
Mã đầy đủ cho bộ điều khiển tập tin tải lên của tôi là như sau:
@Controller
public class FileUploadController {
@RequestMapping(value="/upload", method=RequestMethod.POST)
public void upload(HttpServletRequest request) {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart) {
// Inform user about invalid request
return;
}
//String filename = request.getParameter("name");
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload();
// Parse the request
try {
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream item = iter.next();
String name = item.getFieldName();
InputStream stream = item.openStream();
if (item.isFormField()) {
System.out.println("Form field " + name + " with value " + Streams.asString(stream) + " detected.");
} else {
System.out.println("File field " + name + " with file name " + item.getName() + " detected.");
// Process the input stream
OutputStream out = new FileOutputStream("incoming.gz");
IOUtils.copy(stream, out);
stream.close();
out.close();
}
}
}catch (FileUploadException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
}
@RequestMapping(value = "/uploader", method = RequestMethod.GET)
public ModelAndView uploaderPage() {
ModelAndView model = new ModelAndView();
model.setViewName("uploader");
return model;
}
}
Vấn đề là các getItemIterator(request)
luôn trả về một iterator mà không có bất kỳ mục (ví dụ: iter.hasNext()
) luôn trả về false
.
tập tin application.properties của tôi là như sau:
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:19095/authdb
spring.datasource.username=georbis
spring.datasource.password=asdf123
logging.level.org.springframework.web=DEBUG
spring.jpa.hibernate.ddl-auto=update
multipart.maxFileSize: 128000MB
multipart.maxRequestSize: 128000MB
server.port=19091
Quan điểm JSP cho /uploader
là như sau:
<html>
<body>
<form method="POST" enctype="multipart/form-data" action="/upload">
File to upload: <input type="file" name="file"><br />
Name: <input type="text" name="name"><br /> <br />
Press here to upload the file!<input type="submit" value="Upload">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
</body>
</html>
Những gì tôi có thể làm sai?
Bạn đã tắt hỗ trợ đa luồng suối không, giải pháp của bạn sẽ không hoạt động và Spring đã phân tích cú pháp các yêu cầu. Thay thế tất cả các thuộc tính 'multipart' bằng một' multipart.enabled = false' duy nhất để vô hiệu hóa việc xử lý mặc định. –
Tôi đã không thực hiện bất kỳ điều gì cụ thể để vô hiệu hóa hỗ trợ đa phần xuân. Tôi đã thử thêm 'multipart.enabled = false' vào tệp' application.properties' của tôi. Tuy nhiên, một khi tôi làm điều đó, tôi chỉ nhận được một '405: Yêu cầu phương pháp' POST 'không được hỗ trợ' lỗi mỗi khi tôi thực hiện một tải lên. – balajeerc
Điều này sẽ cho biết ánh xạ sai hoặc đăng lên sai url ... Bật ghi nhật ký gỡ lỗi và xem URL bạn đang đăng và URL nào mà phương thức điều khiển của bạn được đối sánh. –