前后端分离项目--下载功能


前后端分离项目中下载与其他接口的使用不同,一般下载不走node,不通过代理服务器,而是直接在前台发送请求,又因为前端使用的是代理服务器,会出现跨域问题,需要后端协助,允许下载文件接口跨域

不使用代理服务器

axios({
    method: 'GET',
    url: `url`,  // 后端下载接口
    headers: {
        token: token
    },
    params: {
        fileId: id
    },
    // 后端返回的是二进制数据,请求的响应类型为二进制数据,如果不加下载的文件是乱码
    responseType: 'blob'   
}).then(res => {
    let file = res.data
    let disposition = (res.headers['content-disposition']).split('=')
    let filename = disposition[1] //文件名
    const blob = new Blob([file])
    let url = URL.createObjectURL(blob)
    // 创建下载链接
    let downloadLink = document.createElement('a');
    downloadLink.href = url
    downloadLink.download = filename; // 设置文件名
    // 添加到页面并模拟点击下载rendering
    document.body.appendChild(downloadLink);
    downloadLink.click();
    // 清理下载链接
    document.body.removeChild(downloadLink);
})
  .catch(err => {
      console.log(err)
  })

blob

blob表示二进制的大对象。在数据库管理系统中,将二进制数据存储为一个单一个体的集合。在 JavaScript 中 Blob 类型的对象表示不可变的类似文件对象的原始数据。
Blob 对象含有两个属性:size 和 type。其中 size 属性用于表示数据的大小(以字节为单位),type 是一个字符串。

blob构造函数
const blob = new Blob([file])
通过FormData对象的getBlob方法创建Blob对象
const formData = new FormData();
formData.append('file', file);
const blob = formData.getBlob('file');
将Blob对象转换成UR
const url = URL.createObjectURL(blob)

使用代理服务器

如果用node,浏览器端还需要判断下载文件类型,从而添加对应的content-type和拓展名,如果后端返的全是200,还可能出现没有文件,下载下来是下图这样的
在这里插入图片描述浏览器端

function fileDownload() {
    const fileDwon = document.querySelectorAll('.fileDwon')
    console.log(fileDwon);
    fileDwon.forEach(function (value) {
        value.addEventListener('click', function () {
            let id = value.id
            console.log(id);
            download({
                method: 'GET',
                url: `/downLoadFile`,
                params: {
                    id: id
                },
                responseType: 'blob',
            }).then(res => {

                let file = res.data;
                const blob = new Blob([file])
                let url = URL.createObjectURL(blob)
                console.log(blob);
                // 创建下载链接
                var downloadLink = document.createElement('a');
                downloadLink.href = url
                downloadLink.download = `${res.headers.filename}.doc`; // 设置文件名
                // 添加到页面并模拟点击下载
                document.body.appendChild(downloadLink);
                downloadLink.click();
                // 清理下载链接
                URL.revokeObjectURL(url);
                document.body.removeChild(downloadLink);
            })
            .catch(err => {
                    console.log(err)
            })
        })
    })
}

服务器端

// 下载文件
router.get('/downLoadFile', async (req, res) => {

    let fileId = req.query.id
    let token = req.headers.token
    const url = `http://123.57.144.143:8080/warmHeartDownload/downLoadFile`;
    try {
        const pipelineAsync = promisify(pipeline);
        const response = await fetch(url, {
            headers: {
                token
            },
            params: {
                fileId: fileId
            },
        });

        if (!response.ok) {
            console.error('获取失败');
        }
        await pipelineAsync(response.body, res);

    } catch (error) {
        console.error('Download error:', error);
        res.status(500).send('Error downloading file');
    }
})
好的,那我们来看一下如何使用Spring Boot实现一个前后端分离的仓库管理系统。 1. 项目搭建 首先需要创建一个Spring Boot项目,并添加必要的依赖。一般需要添加Spring Web、Spring Data JPA、MySQL、Thymeleaf等依赖,具体依赖根据实际需求而定。 2. 数据库设计 根据仓库管理系统的需求,设计数据库结构。一般需要设计仓库、商品、订单等表。 3. 后端开发 使用Spring Data JPA实现数据持久化和业务逻辑。创建相应的实体类、DAO、Service和Controller,并进行相应的注解配置。在Controller中提供RESTful风格的API接口,用于前端与后端的数据交互。 4. 前端开发 前端开发可以使用Vue、React、Angular等框架进行开发。在前端中调用后端提供的API接口,实现数据的展示、添加、修改、删除等功能。可以使用axios等HTTP库进行数据交互。 5. 前后端联调 前后端分离项目需要进行前后端的联调。在本地开发环境中,前端可以使用代理服务器将API请求转发给后端,在生产环境中,需要将前后端分别打包成静态文件和Java应用,并将静态文件部署到Web服务器中。 6. 部署上线 将项目打包成可执行文件,并部署到服务器上。可以使用Docker等容器技术进行部署,也可以使用Jenkins等自动化工具进行持续集成和部署。 以上就是使用Spring Boot实现前后端分离的仓库管理系统的基本流程。具体实现细节和技术选择需要根据实际需求而定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值