java后端向前端发送blob类型、arraybuffer类型数据流(解决前端跨域问题)

java后端向前端发送blob类型、arraybuffer类型数据流(解决前端跨域问题)

项目需求概述:
前端请求图片时遇到跨域问题,
思考解决方案时,考虑前端请求本地javaweb接口时带上图片url,
由后端请求到图片后再发送到前端。

后端代码

package com.neusoft.viic.server.dataService.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @author dume
 * @create 2022-01-05 10:42
 **/
@Api(tags = "图片请求,前端blob类型或者arraybuffer类型接收")
@Controller
@RequestMapping("/image")
public class ImageController {

    @GetMapping(value = "/download")
    @ApiOperation(value = "图片请求")
    public void download(String url, HttpServletResponse response) throws Exception {
        ServletOutputStream out =null;
        ByteArrayOutputStream baos = null;
        try {
            //new一个URL对象
            URL connection = new URL(url);
            //打开链接
            HttpURLConnection conn = (HttpURLConnection) connection.openConnection();
            //设置请求方式为"GET"
            conn.setRequestMethod("GET");
            //超时响应时间为5秒
            conn.setConnectTimeout(5 * 1000);
            //通过输入流获取图片数据
            InputStream inStream = conn.getInputStream();
            byte[] buffer = new byte[1024];
            int len;
            baos = new ByteArrayOutputStream();
            while ((len=inStream.read(buffer))!=-1){
                baos.write(buffer,0,len);
            }
            response.addHeader("Content-Disposition", "attachment;filename=" + url);
            response.addHeader("Content-Length", "" + baos.size());
            response.setHeader("filename", url);
            response.setContentType("application/octet-stream");
            out = response.getOutputStream();
            out.write(baos.toByteArray());

        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException();
        }finally {
            baos.flush();
            baos.close();
            out.flush();
            out.close();

        }


    }

}

前端代码:

//获取图片用于前端打包下载
var getFile = function(imgUrl) {
	return new Promise((resolve, reject) => {
		axios({
			method:'get',
			url: HOST_VIIC + 'image/download?url=' + imgUrl,
			responseType:'arraybuffer'		//这个参数必须加上,否则返回的图片打包后无法显示
		}).then(data => {
			resolve(data.data)
		}).catch(error => {
			reject(error.toString())
		})
	})
}

其中responseType:‘arraybuffer’,写成responseType:'blob’也可以。

如果你的url存在中文和特殊字符,请查看我另一篇文章:
java发送url请求地址中有中文和特殊字符,java发送到前端的文件名存在特殊字符,java后端向前端发送blob类型、arraybuffer类型数据流,后端和前端解决方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小七蒙恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值