前后端实现图片预览

3 篇文章 0 订阅

1、背景

今天做了一个图片预览,碰到了3个问题:
1、要做这个效果,后台要做些什么
2、前端要怎么做
3、请求头中地址如何获取(前后端)
直接上代码(项目:springboot + vue)

1、后台部分

fileUtil.java

//这是这个工具类中的一个方法
// 下面的savePath 是文件上传时的根目录 下面图中可以看到这个值
public String viewPicture(HttpServletResponse response,String filePath) {
		
		String format = filePath.substring(filePath.lastIndexOf(".") + 1);
		File file = new File(savePath + filePath);
		try {

				if (file.exists() && file.isFile()) {
					//读取图片文件流
					BufferedImage image = ImageIO.read(new FileInputStream(file));
					//将图片写到输出流
					ImageIO.write(image, format, response.getOutputStream());
					return null;
				} else {
					return "文件不存在";
				}

		} catch (IOException e) {
			return "预览失败";
		}

	}
	

	//下面这行代码是swagger中的 ,这个不用管,与图片预览这一功能无关的代码
	//@ApiOperation(value = "查看图片的接口",httpMethod = "GET")

	//url 就是 文件在数据库中存储的路径,我这是前端可以直接拿到该字段,如果前端能传图片记录的id过来,后台可以通过这个id拿到这个路径 

	//fileUtil ,这是我创建的一个文件的工具类 ,
	//我这是做了配置(看下图),注意:我这用到的是springboot ,笨一点的办法就是 通过new FileUtil() 拿到 fileUtil new出来的话下面被的代码就不要了,
	
	@Autowired//here 不要了
	private FileUtil fileUtil;//here 不要了

	@GetMapping("/view")
	public CommonReturn viewPicture(@RequestParam("url") String url,HttpServletResponse response,HttpServletRequest request){

		
		String fileResult = fileUtil.viewPicture(response,url);
		if(fileResult == null){

			return CommonReturn.initResult(1,"文件预览成功",str);
		} else {

			return CommonReturn.initResult(-1,fileResult,url);
		}
	}

FileUtil的配置

2、前端 (vue)

//页面上有个这个东西就可以了 img 标签、和一个查看按钮(按钮要绑定事件) 、直接将刚发送请求的请求地址作为src的值

	<div style="text-align: center;height:400px">
        <img  :src="picturePath" style="width: 100%;height: 100%" />
        <button type="button">查看图片</button>
    </div>


点击查看按钮执行下面方法


//这里用到的是vue 请求发送用到了 axios
 showPicture(picturePath){
        var _this = this;
        _this.$axios.get('/api/picture/view',{params:{url:picturePath}}).then(res =>{
          _this.picturePath= res.request.responseURL;//这一行下面进行解释
          this.seePictureDialogVisible = true//发送请求就行,这行不用管,就是之前写好的那个接口
        });

3、前后端如何拿到请求的地址(含参数的)

红框中的这个东西,后面带了参数

//请求带参数到请求路径里面了,浏览器会对该路径进行处理,不能进行拼接拿到,下面讲怎么拿到它
(1)前端
 _this.$axios.get('/api/picture/view',{params:{url:picturePath}}).then(res =>{
          console.log(res);//在发送请求后的回调中打印 回调参数 res ,会得到下图
          _this.picturePath= res.request.responseURL;
          this.seePictureDialogVisible = true
        });

在这里插入图片描述
从这张图中可以看到我们要的东西就是 responseURL

res.request.responseURL;//可以通过这行代码拿到
(2)后端
String str = "http://" + request.getServerName() //服务器地址
				+ ":"
				+ request.getServerPort()           //端口号
				+ request.getContextPath()      //项目名称
				+ request.getServletPath()      //请求页面或其他地址
				+ "?" + (request.getQueryString()); //参数
		System.out.println(str);

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Spring Boot 和 Vue 前后端分离架构中,实现文件预览可以通过前端发送请求获取文件的 URL,然后在前端使用相关插件或组件进行文件预览。 下面是一种可能的实现方式: 1. 后端实现: - 在 Spring Boot 中配置静态资源路径,将存储文件的文件夹路径设置为静态资源路径。例如,可以在 `application.properties` 文件中添加以下配置: ``` spring.resources.static-locations=file:/path/to/files/ ``` - 后端提供一个接口,用于返回文件的URL。可以在控制器中编写如下代码: ```java @RestController public class FileController { @Value("${spring.resources.static-locations}") private String staticResourcePath; @GetMapping("/api/file/{fileName}") public ResponseEntity<Resource> getFile(@PathVariable String fileName) throws IOException { Path filePath = Paths.get(staticResourcePath + fileName); Resource resource = new UrlResource(filePath.toUri()); if (resource.exists() && resource.isReadable()) { return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"") .body(resource); } else { // 文件不存在或无法读取 return ResponseEntity.notFound().build(); } } } ``` 2. 前端实现: - 在 Vue 组件中,使用 axios 或其他网络请求库发送 GET 请求,获取文件的 URL。例如: ```javascript import axios from 'axios'; // 在组件中调用接口获取文件 URL axios.get('/api/file/fileName.pdf') .then(response => { const fileUrl = response.data; // 使用文件预览插件或组件进行预览 // 例如,可以使用 pdf.js 进行 PDF 文件预览 // 或者使用 <img> 标签显示图片、使用 <video> 标签播放视频等 }) .catch(error => { console.error(error); }); ``` 需要注意的是,上述代码只是一种简单的实现方式,具体的预览方式和插件选择取决于你要预览的文件类型。你可以根据实际需求选择合适的插件或组件来实现文件预览功能,例如 pdf.js、viewer.js 等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值