vue3使用后端传递的文件流进行文件预览

文章目录

一、 注意事项

1、responseType设置为:arraybuffer
2、Blob设置type,来源于后台封装的response.headers['content-type']
3、使用encodeURIComponent(),避免符号影响文件名
sql 复制代码
function previewFile(file) {
    let newName = file.fileNewName
    let filePath = file.filePath
    let path = filePath+newName
    let encodedFileName =  encodeURIComponent(path)
    const lowerCaseFileName = newName.toLowerCase();
    const fileExtension = lowerCaseFileName.split('.').pop();
    const allowedExtensions = ['pdf', 'jpg', 'jpeg', 'png'];
    if (allowedExtensions.includes(fileExtension)) {
        let service = axios.create({
            baseURL: '/fjxz',
            responseType: 'arraybuffer',
            timeout: 60000,
            headers: {
                'Content-Type': 'application/octet-stream',
            },
            withCredentials: true,
        });
        service.get(`/system/fileupload/preview/file?filePath=${filePath + newName}`)
            .then((response) => {
                console.log(response)
                let contentType = response.headers['content-type'];
                let blob = new Blob([response.data], {
                    type: contentType
                });
                let link = document.createElement('a');
                link.href = window.URL.createObjectURL(blob);
                link.target = "_blank";
                link.click();
            })
            .catch((error) => { })
    } else {
        ElMessage({
            message: '只有PDF和图片才能预览!',
            type: 'warning',
        })
    }


}

二、java接口

sql 复制代码
@GetMapping("/preview/file")
public void filePreview(HttpServletResponse response, @RequestParam("filePath") String filePath){

    try {
        String extension = getFileExtension(filePath);
        String mimeType = getMimeType(extension);
        // 设置响应头
        response.setContentType(mimeType);

        String encodedFileName = URLEncoder.encode(getFileName(filePath), "UTF-8");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"");

        FileInputStream fis = new FileInputStream(fileSavePath + filePath);
        ServletOutputStream os = response.getOutputStream();

        byte [] b = new byte[1024*8];
        while(fis.read(b)!=-1){
            os.write(b);
        }
        fis.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
相关推荐
林强1812 小时前
前端文件预览docx、pptx和xlsx
前端
计算机学姐2 小时前
基于微信小程序的高校班务管理系统【2026最新】
java·vue.js·spring boot·mysql·微信小程序·小程序·mybatis
像是套了虚弱散4 小时前
DevEco Studio与Web联合开发:打造鸿蒙混合应用的全景指南
开发语言·前端·华为·harmonyos·鸿蒙
衬衫chenshan5 小时前
【CTF】强网杯2025 Web题目writeup
前端
飞翔的佩奇5 小时前
【完整源码+数据集+部署教程】【天线&水】舰船战舰检测与分类图像分割系统源码&数据集全套:改进yolo11-repvit
前端·python·yolo·计算机视觉·数据集·yolo11·舰船战舰检测与分类图像分割系统
哆啦A梦15886 小时前
点击Top切换数据
前端·javascript·vue.js
程序猿追6 小时前
Vue组件化开发
前端·html
艾德金的溪7 小时前
redis-7.4.6部署安装
前端·数据库·redis·缓存
小光学长7 小时前
基于Vue的2025年哈尔滨亚冬会志愿者管理系统5zqg6m36(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
@PHARAOH7 小时前
WHAT - 受控组件和非受控组件
前端·javascript·react.js