后台返回文件流前台预览pdf功能
最近开发的一个功能,文件(jar包、img/png,pdf等等文件)存入minio里面,但是图片和pdf需要预览的功能,记录一下:
后台返回文件流(所有文件的写法都一样,只是bucket和桶里面的路径UUID不一样):
1 @Override 2 public void getPDF(String uuid, HttpServletResponse response) throws IOException { 3 4 // 读到流中 5 InputStream inputStream = SpringContextUtil.getMinioUtilsBean("avatarBucket").download(uuid); 6 response.reset(); 7 response.setContentType("application/octet-stream");//application/pdf 8 response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(uuid, "UTF-8")); 9 ServletOutputStream outputStream = response.getOutputStream(); 10 byte[] buffer = new byte[1024]; 11 int len; 12 //从输入流中读取一定数量的字节,并将其存储在缓冲区字节数组中,读到末尾返回-1 13 while ((len = inputStream.read(buffer)) > 0) { 14 outputStream.write(buffer, 0, len); 15 } 16 inputStream.close(); 17 }
axios:
1 // 获取附件流 PDF的 2 export const getPDF = (uuid) => { 3 return axios.request({ 4 url: '/api/cwsh/robotApproval/getPDF', 5 method: 'post', 6 params: { 7 uuid: uuid 8 }, 9 // headers: {'Content-Type': 'multipart/form-data'}, 10 responseType: 'blob'//'muliipart/form-data'//'blob'//'arraybuffer' 假如下面的iframe组件是用来显示pdf或者图片的这里就responseType就可以通过js调用时传参来赋值(pdf为‘blob,图片为‘arraybuffer’’) 11 }) 12 } 13 14 // 机器人头像流返回 图片 15 export const downloadRobot = (avatar) => { 16 return axios.request({ 17 url: '/api/cwsh/sysRobot/download', 18 method: 'post', 19 params: { 20 avatar:avatar 21 }, 22 responseType: 'arraybuffer' 23 }) 24 }
js方法:
//预览pdf部分代码 <template> <el-check-tag v-for="(item,index) in detailDataList.fjList" :key="index" class="ml-2" @click="downloadFile(item.wjbh)" style="margin-left: 2px;">{{item.fjmc}}</el-check-tag> <el-drawer v-model="innerVisible" title="I am the title" :with-header="false" size="70%">
假如这里iframe是需要展示图片和pdf的,name只需要改axios请求接口的responseType和接收到的流赋值给imgBase64的赋值即可 <iframe style="width: 100%;height: 100%;" :src="imgBase64"></iframe> </el-drawer> </template> <script setup lang="ts"> const imgBase64=ref('') const downloadFile = (minioID)=>{ debugger // ElMessage.info("准备下载"+minioID) getPDF(minioID).then(res => { debugger // let urlPdf = window.URL.createObjectURL(new Blob(res,{type:"application/pdf"})) //用sdk插件 // imgBase64.value = '/pdf/web/viewer.html?file=' + encodeURIComponent(urlPdf)
假如这里返回的分别是图片的流和pdf的流对应的处理方式
if(showFileType.value === 'picture') {//图片
imgBase64.value = "data:image/png;base64," +
btoa(
new Uint8Array(res).reduce(
(res,byte) => res + String.fromCharCode(byte),
""
)
)
}else {// pdf
let blob = new Blob([res], { type: 'application/pdf' let fileURL = URL.createObjectURL(blob); // window.open(fileURL); imgBase64.value = fileURL
}
innerVisible.value=true }) } <script/>
图片
1 <el-image :src="imgBase64"></el-image> 2 3 4 5 const imgBase64 = ref('') 6 const downloadRobotFun = function(avatar) { 7 downloadRobot(avatar).then(res => { 8 debugger 9 // imgBase64.value=getBase64(res) 10 imgBase64.value = "data:image/png;base64," + 11 btoa( 12 new Uint8Array(res).reduce( 13 (res,byte) => res + String.fromCharCode(byte), 14 "" 15 ) 16 ) 17 debugger 18 }) 19 } 20 21
效果:
1.图片
2.pdf