springboot部署之后无法获取项目目录的问题:
之前看到网上有提问在开发一个springboot的项目时,在项目部署的时候遇到一个问题:就是我将项目导出为jar包,然后用java -jar 运行时,项目中文件上传的功能无法正常运行,其中获取到存放文件的目录的绝对路径的值为空,文件无法上传。问题链接
不清楚此网友具体是怎么实现的,通常我们可以通过如下方案解决:
//获取跟目录 File path = new File(ResourceUtils.getURL("classpath:").getPath()); if(!path.exists()) path = new File(""); System.out.println("path:"+path.getAbsolutePath()); //如果上传目录为/static/images/upload/,则可以如下获取: File upload = new File(path.getAbsolutePath(),"static/images/upload/"); if(!upload.exists()) upload.mkdirs(); System.out.println("upload url:"+upload.getAbsolutePath()); //在开发测试模式时,得到的地址为:{项目跟目录}/target/static/images/upload/ //在打包成jar正式发布时,得到的地址为:{发布jar包目录}/static/images/upload/
另外使用以上代码需要注意,因为以jar包发布时,我们存储的路径是与jar包同级的static目录,因此我们需要在jar包目录的application.properties配置文件中设置静态资源路径,如下所示:
#设置静态资源路径,多个以逗号分隔 spring.resources.static-locations=classpath:static/,file:static/
以jar包发布springboot项目时,默认会先使用jar包跟目录下的application.properties来作为项目配置文件。
具体项目实战:
resttemplate上传文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
/**
* 处理文件上传
*/
@RequestMapping
(
"/remoteupload"
)
@ResponseBody
public
String douploadRemote(HttpServletRequest request,
@RequestParam
(
"file"
) MultipartFile multipartFile) {
if
(multipartFile.isEmpty()) {
return
"file is empty."
;
}
String originalFilename = multipartFile.getOriginalFilename();
String newFileName = UUIDHelper.uuid().replace(
"-"
,
""
) + originalFilename.substring(originalFilename.lastIndexOf(
"."
) -
1
);
File file =
null
;
try
{
File path =
new
File(ResourceUtils.getURL(
"classpath:"
).getPath());
File upload =
new
File(path.getAbsolutePath(),
"static/tmpupload/"
);
if
(!upload.exists()) upload.mkdirs();
String uploadPath = upload +
"\\"
;
file =
new
File(uploadPath + newFileName);
multipartFile.transferTo(file);
// 提交到另一个服务
FileSystemResource remoteFile =
new
FileSystemResource(file);
// package parameter.
MultiValueMap<String, Object> multiValueMap =
new
LinkedMultiValueMap<>();
multiValueMap.add(
"file"
, remoteFile);
String remoteaddr =
"http://localhost:12345/test/doupload"
;
String res = restTemplate.postForObject(remoteaddr, multiValueMap, String.
class
);
return
res;
}
catch
(Exception e) {
return
"file upload error."
;
}
finally
{
try
{
file.delete();
}
catch
(Exception e) {
// nothing.
}
return
"ok"
;
}
}
|
可以参见resttemplate文件上传: