我希望接收文件并将其保存在资源内的文件夹中。我有此终结点
public ResponseEntity<String> uploadPhoto(@RequestParam("file") MultipartFile file) {
try {
String photoName = file.getOriginalFilename();
String path = servletContext.getClassLoader().getResource("resources/static/photos/").getPath() + photoName;
try (FileOutputStream fileOutputStream = new FileOutputStream(path)) {
fileOutputStream.write(file.getBytes());
}
return ResponseEntity.ok().build();
} catch (Exception e) {
log.info(e);
return ResponseEntity.status(400).body(Exceptions.BAD_REQUEST.getMessage());
}
}
它会把文件保存到我需要的地方,但是我在服务器上也有这个应用程序的一个版本,我在服务器上用这个应用程序运行一个JAR,我的Dockerfile
FROM openjdk:11
ARG JAR_FILE=build/libs/appname-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
我试图在服务器上运行此表单中的应用程序,但出现错误“没有这样的目录”。
servletContext.getClassLoader().getResource()
方法并接收此路径
file:/app.jar!/BOOT-INF/classes!/
我应该做什么来接收资源路径?
1条答案
按热度按时间wfsdck301#
我想接收文件并将其保存在资源内的文件夹中。
这是不可能的。“resources”文件夹在一个模糊的、未知的位置。通常它是一个jar文件中的一堆条目。类路径抽象不支持“写入"类路径,即使你尝试使用黑客来做这件事,类路径通常是不可写的;一个可以写入自己文件夹的应用程序是一个小的安全失误,在一些操作系统(特别是windows)上,替换一个打开的文件并不那么容易。
写入文件的正确位置通常是主目录,例如
Paths.get(System.getProperty("user.home"), "myProjectName")
,或者用户可以在首选项对话框或设置文件中显式配置的位置。