保存pdf文件至数据库,在线预览并下载到本地

      这几天在做将pdf文件转为字节流并保存至数据库,然后再从数据库中中下载下来的工作。所用的东西比较简单,但是也比较琐碎,因为以前没有用过,耽误了点时间,现在整理下来,希望帮助到大家。

    上传

    首先是页面,如下所示就可以了。当然在后台要定义一个File类型的变量,来接收从前台传过来的参数。我在后台定义的变量名也是upfile

  

 附件上传:<input type="file" id="upfile" name="upfile">

 

定义了一个实体类FileBin用来保存文件相关的信息。在数据库中用于保存upfile的字段定理的类型是blob

后台接收到upfile后,首先将其转化为byte类型。

getBytesFromFile(upfile)

这个函数的实现如下所示:


 

/**
	 * 把文件转换为byte文件以保存到数据库

	 	 */
	 public static byte[] getBytesFromFile(File f){
	        if (f == null){
	            return null;
	        }
	        try {
	            FileInputStream stream = new FileInputStream(f);
	            ByteArrayOutputStream out = new ByteArrayOutputStream(1000);
	            byte[] b = new byte[1000];
	            int n;
	            while ((n = stream.read(b)) != -1)
	                out.write(b, 0, n);
	            stream.close();
	            out.close();
	            return out.toByteArray();
	        } catch (IOException e){
	        }
	        return null;
	    }

保存至数据库

FileBin fileBin=new FileBin();
fileBin.setBinName(upfileFileName);
 fileBin.setFileRefId(fileRef.getFileRefId());
fileBin.setBinfile(getBytesFromFile(upfile));			
//获取文件后缀
fileBin.setBinSuffix(upfileFileName.substring(upfileFileName.lastIndexOf(".")+1));
fileBin.setBinType(Integer.parseInt(fileType));
 fileService.saveFileBin(fileBin);


上传就完成了。下面是查看。

查看

查看所要实现的是在线预览的功能。比较容易,当点击查看时,跳到一个新的页面,该页面嵌套了一个iframe,这个iframe的src是读取该pdf文件的action

acion的核心方法实现如下:

binId是fileBin的主键

if(binId!=null&&!"".equals(binId))
		{
			fileBin=fileService.getFileBin(binId);
			OutputStream output = Struts2Utils.getResponse().getOutputStream(); 
			output.write(fileBin.getBinfile());
			output.close(); 
			/*OutputStream output = new FileOutputStream("e://"+fileBin.getBinName());
			output.write(fileBin.getBinfile());
			output.flush();
			output.close();*/
		}


下载

 

 

从服务器下载到本地,核心方法如下

<span style="font-size:12px;color:#000000;">/**
	 * 从数据库里下载文件
	 * @param suffix 后缀
	 * @return
	 */
	public void downloadPdfFile() throws IOException
	{
		HttpServletResponse response=(HttpServletResponse)ActionContext.getContext().get(StrutsStatics.HTTP_RESPONSE);
		response.reset();
		response.setContentType("application/x-download;charset=utf-8");
		fileBin=fileService.getFileBin(binId);
		response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileBin.getBinName(),"utf-8"));
		OutputStream output = Struts2Utils.getResponse().getOutputStream(); 
		output.write(fileBin.getBinfile());
		output.flush();
		output.close();
		
	}</span>

核心思想就是,将文件流放入到respons中,然后输出。用来指定编码格式:

<span style="font-size:12px;color:#000000;">response.setContentType("application/x-download;charset=utf-8");
</span>


 

<span style="font-size:12px;color:#000000;">response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileBin.getBinName(),"utf-8"));
</span>


此句话用来告诉浏览器,这是要进行另存为,从而弹出另存为的对话框。

fileName后面是表面弹出来的对话框中默认的文件名字,因为是中文,会出现乱码,所以要用URLEncoder.encode()的函数来转成utf-8编码方式。


好吧,看起来也比较白痴,希望可以帮助和我一样基础薄弱的人,嘻嘻。

  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值