这几天在做将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编码方式。
好吧,看起来也比较白痴,希望可以帮助和我一样基础薄弱的人,嘻嘻。