我在jsp中有上传文件选项,并且图像正在srcmainwebappupload
目录中上传。相反,我希望将图像上传到srcmainresourcesimages
文件夹中。我想首先检查是否有图像文件夹,如果没有任何图像文件夹,那么我想制作一个新的文件夹图像。
这是我尝试过的:
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository empRepository;
public Employee saveEmployee(HttpServletRequest request, Employee employee){
// Root Directory.
String uploadRootPath = request.getServletContext().getRealPath("upload");
System.out.println("uploadRootPath=" + uploadRootPath);
File uploadRootDir = new File(uploadRootPath);
// Create directory if it not exists.
if (!uploadRootDir.exists()) {
uploadRootDir.mkdirs();
}
MultipartFile fileData = employee.getFileData();
String name = fileData.getOriginalFilename();
System.out.println("Client File Name = " + name);
if (name != null && name.length() > 0) {
try {
// Create the file at server
File serverFile = new File(uploadRootDir.getAbsolutePath() + File.separator + employee.getiNumber()+".jpg");
BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(serverFile));
stream.write(fileData.getBytes());
stream.close();
//
System.out.println("Write file: " + serverFile);
} catch (Exception e) {
System.out.println("Error Write file: " + name);
}
}
if(employee.getiNumber()==null){
empRepository.save(employee);
}
else{
empRepository.save(employee);
}
return employee;
}
这是Employee.java
类:
@Entity
@Table(name = "employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@NotBlank
private String iNumber;
@NotBlank
private String fullName;
// @NotBlank
private String joinedDate;
@NotBlank
private String position;
@NotBlank
private String reportsTo;
@NotBlank
private String cubicleNo;
@NotBlank
private String jobType;
// Upload files.
@Transient
private MultipartFile fileData;
//all getters setters constuctor
我的图像文件已成功加载到srcmainwebappupload
目录中,但我希望图像保存在srcmainresourcesimages
中。
你真的不应该在那里上传文件。
如果您使用的是战争,重新部署将删除它们。如果它们是临时的,请使用操作系统分配的临时位置。
如果您打算在之后发布它们,请选择在服务器上存储文件的位置,使应用程序知道此位置,并从该位置保存和加载文件。
如果您尝试动态替换资源,例如在 html 或 css 模板中引用的图像,请考虑单独发布外部位置,您可以使用 mvc:resources 为此,例如:
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/images/**").addResourceLocations("file:/absolute/path/to/image/dir");
}
然后,您将文件保存到该位置。这将使部署之间的永久性。
要使用代码将图像保存到该位置,您需要将其添加到属性或 YML 文件中
imagesFolder:"/absolute/path/to/image/dir"
只需将您的逻辑添加到此即可。
@value("${imagesFolder}")
private String imagesFolder;
public void setImagesFolder(String imagesFolder) {
this.imagesFolder = imagesFolder;
}
public String fileUpload(UploadedFile uploadedFile) {
InputStream inputStream = null;
OutputStream outputStream = null;
MultipartFile file = uploadedFile.getFile();
String fileName = file.getOriginalFilename();
File newFile = new File(imagesFolder + fileName);
try {
inputStream = file.getInputStream();
if (!newFile.exists()) {
newFile.createNewFile();
}
outputStream = new FileOutputStream(newFile);
int read = 0;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
} catch (IOException e) {
e.printStackTrace();
}
return newFile.getAbsolutePath();
}
请记住,您需要将/absolute/path/to/image/dir 更改为存在的实际路径,我也建议查看 Spring 资源文档,以获得处理文件和资源的更好方法。