java流实现跨域图片视频的预览

本文介绍了一种通过文件流安全预览文件的方法,避免了直接暴露文件路径的问题。讨论了在IE浏览器下请求缓存导致预览内容重复的解决方案,如修改IE设置或在URL中加入随机数。同时,提供了controller代码示例,展示了如何使用BufferedInputStream处理文件流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.目的

如果简单的预览,会暴露文件的具体位置,可能是地址栏里,或者js代码里(打开调试工具就能看到)。 这时候用文件流,文件地址就不会被别人看到了

 

2.前台

当加载到这个标签的时候, 自动跳转到controller

<img id="picture" src= "<%=request.getContextPath()%>/preview/getFileStream"  style=" vertical-align: middle; text-align: center;" />

如果你使用的是IE浏览器,那么这个请求是有问题的

每次请求的URL都是  preview/getFileStream, IE浏览器会给你从缓存里拿东西。

所以每次预览的内容都是一样的。

解决方法:

   1.  设置自己的IE,每次打开页面不加载缓存

         一个人还好, 很多人的话,这个不太实际

   2.  在请求的URL中加一个参数  Math.random()

          这样每次请求的URL都不一样, 你的Controller拼接一下就行了,避免404错误

 

3.controller代码

    @RequestMapping(value = "/getFileStream", method = RequestMethod.GET)
    public void pdfStreamHandler(HttpServletRequest request, HttpServletResponse response) {
    	String fileSrc=(String) request.getSession().getAttribute("fileSrc");
        File file = new File(fileSrc);
        try {
            byte[] data = null;
            try {
            	String strUrl = fileSrc.trim();  
                URL url=new URL(strUrl);
                //打开请求连接
                URLConnection connection = url.openConnection();
                HttpURLConnection httpURLConnection=(HttpURLConnection) connection;
                httpURLConnection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
                // 取得输入流,并使用Reader读取
                int responseCode=((HttpURLConnection) connection).getResponseCode();
                BufferedInputStream bis=null;
                	 bis = new BufferedInputStream(httpURLConnection.getInputStream());
                ServletOutputStream sos = response.getOutputStream();
				//BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
				int b;
				while((b = bis.read())!=-1) {
					sos.write(b);
				}
				sos.close();
				bis.close();
            } catch (Exception e) {
            }
        }
        catch (Exception e) {
        	 return;
		}
    }

 

1.URL

URL(String  src)

将src字符串  转为一个URL对象

 

2. URL.openConnection()

返回一个URLConnection实例, 表示URL引用的  远程对象的URL , 这里是远程服务器上的文件

 

3.HttpURLConnection 

我只想获得一个响应码,判断这个文件是否存在  (有更优化的方法,这里不加具体详解)

把connection转换成HttpURLConnection

 

4.BufferedInputStream 

缓冲流 ,这里不是读普通文本,所以不适用FileReader这个函数

BufferedInputStream(InputStream in)

创建一个BufferedInputStream对象, 保存参数in ,供以后使用

 

6.response

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值