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

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

    上传

    首先是页面,如下所示就可以了。当然在后台要定义一个File类型的变量,来接收从前台传过来的参数。我在后台定义的变量名也是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();*/
		}


下载

 

 

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

/**
	 * 从数据库里下载文件
	 * @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();
		
	}

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

response.setContentType("application/x-download;charset=utf-8");


 

response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileBin.getBinName(),"utf-8"));


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

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


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

你可能感兴趣的:(实习项目)