后端如何返回一个(图片)文件流,并在前端vue展示。

这篇具有很好参考价值的文章主要介绍了后端如何返回一个(图片)文件流,并在前端vue展示。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

后端部分可分为三步:
1,获取文件参数(非必须,根据自己情况添加)
2,获取文件
3,以流形式返回
具体代码如下:

/**
	 * 获取文件的流
	 */
	@GetMapping("/getFileByUrl")
	@ApiOperationSupport(order = 7)
	@ApiOperation(value = "逻辑删除", notes = "传入ids")
	public void getFileByUrl(@ApiParam(value = "主键集合", required = true) @RequestParam String url,HttpServletResponse response) throws Exception {
		byte[] buffer = new byte[1024];
		FileInputStream fis = null;
		BufferedInputStream bis = null;
		try {
			//获取部分参数,用于从minIO上将文件下载到tmp(此步骤不是必须)
			String[] split = url.split("\\.");
			String suffix = split[1];
			Long userId = AuthUtil.getUser().getUserId();
			String userName = AuthUtil.getUser().getUserName();
			DownloadInvokePacket packet = InvokePacketUtil.getDownloadInvokePacketForRandomUrl("综合检索文件下载", String.valueOf(userId), userName, suffix, SystemEnum.MANAGE, SystemEnum.MINIO);
			//拿到这个文件
			File file = MinioUtil.publishDownload(packet, url);

			response.setContentType("application/octet-stream");
			response.setHeader("content-type", "application/octet-stream");
			response.setHeader("Content-Disposition", "attachment;fileName=download" + DateUtil.time());// 设置文件名
			//返回流处理
			fis = new FileInputStream(file);
			bis = new BufferedInputStream(fis);
			OutputStream os = response.getOutputStream();
			int i = bis.read(buffer);
			while (i != -1) {
				os.write(buffer, 0, i);
				i = bis.read(buffer);
			}
		}catch (Exception e) {

		}finally {
			if (bis != null) {
				try {
					bis.close();
				} catch (IOException ignored) {
				}
			}
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException ignored) {
				}
			}
		}
	}

前端展示部分。
1,首先在你的axios接口上添加 responseType:'blob' ,以表示你将以blob形式接收(必须添加)。

export const getFileByUrl = (url) => {
  return request({
    url: '/api/comprehensiveSearchLog/getFileByUrl',
    method: 'get',
    responseType:'blob',
    params: {url}
  })
}

2,拿到接口返回值后,将其转为blob形式

const blob = new Blob([result.data], { type: type });
console.log(blob);
let src = window.URL.createObjectURL(blob);
console.log(src);

此时打印该blob,会是下面这种样子:
后端如何返回一个(图片)文件流,并在前端vue展示。
接下来,你可以将拿到的src变量打印,是这种样子:
后端如何返回一个(图片)文件流,并在前端vue展示。
将这个src变量赋值到标签的src上,就可展示此图片了。

附:js下载工具方法文章来源地址https://www.toymoban.com/news/detail-505529.html

/**
 * 下载excel
 * @param {blob} fileArrayBuffer 文件流
 * @param {String} filename 文件名称
 */
export const downloadXls = (fileArrayBuffer, filename) => {
  let data = new Blob([fileArrayBuffer], { type: 'application/vnd.ms-excel,charset=utf-8' });
  if (typeof window.chrome !== 'undefined') {
    // Chrome
    var link = document.createElement('a');
    link.href = window.URL.createObjectURL(data);
    link.download = filename;
    link.click();
  } else if (typeof window.navigator.msSaveBlob !== 'undefined') {
    // IE
    var blob = new Blob([data], { type: 'application/force-download' });
    window.navigator.msSaveBlob(blob, filename);
  } else {
    // Firefox
    var file = new File([data], filename, { type: 'application/force-download' });
    window.open(URL.createObjectURL(file));
  }
};

到了这里,关于后端如何返回一个(图片)文件流,并在前端vue展示。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包