Lưu trữ nó ở bất kỳ đâu trong một vị trí có thể truy cập được ngoại trừ thư mục dự án của IDE hay còn gọi là thư mục triển khai của máy chủ, vì những lý do được đề cập trong câu trả lời cho Hình ảnh đã tải lên chỉ khả dụng sau khi làm mới trang :
Những thay đổi trong thư mục dự án của IDE không được phản ánh ngay lập tức trong thư mục công việc của máy chủ. Có một loại công việc nền trong IDE đảm bảo rằng thư mục công việc của máy chủ được đồng bộ hóa với các bản cập nhật mới nhất (điều này trong thuật ngữ IDE được gọi là "xuất bản"). Đây là nguyên nhân chính của vấn đề mà bạn đang gặp phải.
Trong mã thế giới thực, có những trường hợp lưu trữ các tệp đã tải lên trong thư mục triển khai của ứng dụng web sẽ không hoạt động. Một số máy chủ (theo mặc định hoặc theo cấu hình) không mở rộng tệp WAR đã triển khai vào hệ thống tệp đĩa cục bộ mà thay vào đó là hoàn toàn trong bộ nhớ. Bạn không thể tạo tệp mới trong bộ nhớ mà không chỉnh sửa về cơ bản tệp WAR đã triển khai và triển khai lại.
Ngay cả khi máy chủ mở rộng tệp WAR đã triển khai vào hệ thống tệp đĩa cục bộ, tất cả các tệp mới được tạo sẽ bị mất khi triển khai lại hoặc thậm chí khởi động lại đơn giản, đơn giản vì những tệp mới đó không phải là một phần của tệp WAR ban đầu.
Nó thực sự không quan trọng với tôi hay bất cứ ai khác mà chính xác trên hệ thống tập tin trên đĩa địa phương nó sẽ được lưu lại, miễn là bạn làm không bao giờ sử dụng getRealPath()
phương pháp . Sử dụng phương pháp đó trong mọi trường hợp đáng báo động.
Đường dẫn đến vị trí lưu trữ lần lượt có thể được xác định theo nhiều cách. Bạn phải làm tất cả một mình . Có lẽ đây là nguyên nhân gây ra sự nhầm lẫn của bạn bởi vì bằng cách nào đó bạn đã mong đợi rằng máy chủ thực hiện tất cả điều đó một cách tự động. Xin lưu ý rằng @MultipartConfig(location)
không phải chỉ định điểm đến upload cuối cùng, nhưng vị trí lưu trữ tạm thời cho kích thước hồ sơ vụ án vượt quá ngưỡng bộ nhớ lưu trữ.
Vì vậy, đường dẫn đến vị trí lưu trữ cuối cùng có thể được xác định theo một trong hai cách sau:
Mã cứng:
File uploads = new File("/path/to/uploads");
Biến môi trường thông qua SET UPLOAD_LOCATION=/path/to/uploads
:
File uploads = new File(System.getenv("UPLOAD_LOCATION"));
Đối số VM trong quá trình khởi động máy chủ thông qua -Dupload.location="/path/to/uploads"
:
File uploads = new File(System.getProperty("upload.location"));
*.properties
mục nhập tệp như upload.location=/path/to/uploads
:
File uploads = new File(properties.getProperty("upload.location"));
web.xml
<context-param>
với tên upload.location
và giá trị /path/to/uploads
:
File uploads = new File(getServletContext().getInitParameter("upload.location"));
Nếu có, hãy sử dụng vị trí do máy chủ cung cấp, ví dụ như trong JBoss AS / WildFly :
File uploads = new File(System.getProperty("jboss.server.data.dir"), "uploads");
Dù bằng cách nào, bạn có thể dễ dàng tham khảo và lưu tệp như sau:
File file = new File(uploads, "somefilename.ext");
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath());
}
Hoặc, khi bạn muốn tự động tạo một tên tệp duy nhất để ngăn người dùng ghi đè lên các tệp hiện có trùng tên trùng lặp:
File file = File.createTempFile("somefilename-", ".ext", uploads);
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
Cách lấy part
trong JSP / Servlet đã được giải đáp trong Cách tải tệp lên máy chủ bằng JSP / Servlet? và cách lấy part
trong JSF được giải đáp trong Cách tải tệp lên bằng JSF 2.2 <h: inputFile>? Tệp được lưu ở đâu?
Lưu ý: không sử dụng Part#write()
vì nó diễn giải đường dẫn liên quan đến vị trí lưu trữ tạm thời được xác định trong @MultipartConfig(location)
.
Xem thêm: