文章目录
SpringBoot打成Jar包,访问本地其他路径的静态资源
第一种方式, 增加配置即可
在application.yml中增加配置:
# 属性: spring.web.resources.static-locations
# 该属性的默认值如下: -- [鼠标放在该属性上可以看到提示信息的]
# classpath:/META-INF/resources/, classpath:/resources/, classpath:/static/, classpath:/public/
# 【实际测试通过_Zhaof】
# 本例增加了三个路径:
# 一个相对路径: file:/static/
# 【注意】建议使用--绝对路径--[变量路径的方式,最好也配置成绝对路径],
# 当Java -jar指令不在Jar包目录执行时[java -jar执行路径和Jar包一致时,都可以],
# 相对路径在Jar包下的就找不到了
# 一个绝对路径: file:D:/works/MyFileData/
# 一个变量路径: file:${CustomInfo.PdfFiles}/
# 解决服务打成Jar包时,http访问指定路径的静态资源问题
CustomInfo:
PdfFiles: D:/Pdfs
spring:
web:
resources:
static-locations: classpath:/META-INF/resources/, classpath:/resources/, classpath:/static/, classpath:/public/, file:/static/, file:D:/works/MyFileData/, file:${CustomInfo.PdfFiles}/
# 配置好后,在Jar包路径下/static/,D:/works/MyFileData/的静态资源,均可以直接访问了
# 如: test.txt在 Jar包/static/ 路径下
http://localhost:8080/test.txt
# 如: girl.jpg在 D:/works/MyFileData/ 路径下
http://localhost:8080/girl.jpg
# 如: boy.doc在变量路径: ${CustomInfo.PdfFiles} 即 D:/Pdfs 下
http://localhost:8080/boy.doc
第二种方式: Controller中读取文件并返回
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@Controller
@RequestMapping(value = "/image")
public class ImageController {
// produces 需要指定类型, 否则返回一堆乱码 ,具体可参见MediaType的枚举值
// 网页, produces = MediaType.TEXT_HTML
// PDF, produces = MediaType.APPLICATION_PDF_VALUE
@RequestMapping(value = "/get",produces = MediaType.IMAGE_JPEG_VALUE) // 图片资源
@ResponseBody
public byte[] getImage() throws IOException {
//读取本地文件资源 ,建议先检查文件是否存在哦
File file = new File("D:/test.jpg");
// 将资源写入bytes字节数组并返回即可
FileInputStream inputStream = new FileInputStream(file);
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes, 0, inputStream.available());
return bytes;
}
}
第二种方式的实例: 自己开放浏览器访问PDF的接口
Service层:
@Override
public byte[] GetCfdPdfShow(String cfsb) throws Exception {
//先查询该处方号是否已经生成过
ZhybPdfCfd zhybPdfCfdInfo = zhybPdfCfdDao.selectById(cfsb);
if(zhybPdfCfdInfo == null ){
// 未生成过PDF处方文件,则检查该处方号是否有效!
ZhybCfdMainInfo zhybCfdMainInfo = zhybCfdMainDao.selectById(cfsb);
if(zhybCfdMainInfo==null){
throw new Exception("无效的外配处方识别号: [" + cfsb + "]," +
"请核对该处方识别号是否正确或有效!!!");
}
//数据库记录不存在,则先生成
generateCfdPdf(cfsb,false);
// 重新访问数据库,获取到表中相关信息
zhybPdfCfdInfo = zhybPdfCfdDao.selectById(cfsb);
}
String pdfFile = zhybPdfCfdInfo.getPdf_pathfile();
boolean pdfExist = FileUtil.exist(pdfFile);
if (!pdfExist){
// 数据库记录存在,但Pdf文件资源不存在了,可能被谁手动删除文件,则重新生成
generateCfdPdf(cfsb,true); // 第二个参数True, 表示覆盖重新生成
// 重新访问数据库,获取到表中相关信息
zhybPdfCfdInfo = zhybPdfCfdDao.selectById(cfsb);
// 获取重新生成的Pdf文件目录
pdfFile = zhybPdfCfdInfo.getPdf_pathfile();
pdfExist = FileUtil.exist(pdfFile);
if (!pdfExist) {
// 重新生成后,文件依然不存在
throw new Exception("根据处方识别号: " + cfsb + " 无法获取到有效的Pdf文件!");
}
}
//读取本地文件资源 ,建议先检查文件是否存在哦
File file = new File(pdfFile);
// 将资源写入bytes字节数组并返回即可
FileInputStream inputStream = new FileInputStream(file);
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes, 0, inputStream.available());
return bytes;
}
Controller层
// 浏览器访问, 根据处方识别号显示对应的 Pdf处方单
@GetMapping(value = "/GetCfdPdf/Show/{cfsb}",produces = MediaType.APPLICATION_PDF_VALUE)
@ResponseBody
public byte[] GetCfdPdfShow(@PathVariable String cfsb) throws IOException {
return cfdPdfService.GetCfdPdfShow(cfsb);
}