最近在用别人的平台做一个系统,客户要求所有的附件需要加密存储,也就是在服务器上不能能看可以直接查看的文件,我现在加密是这样做的。当客户上传一个文件后,我会调用加密方法把这个文件写到另一个新的文件里,然后把客户上传的未加密文件删除,再把我加过密的文件名改为客户上传的文件名了,这样就实现了加密,下载的路径也不会错,但是在下载的时候就出现问题了,客户要下载下来的文件是非加密的。也就是说客户在下载之前我需要将此文件进行解密,我现在的思路还是和加密一样,把加过密的文件读出来生成一个新的解密文件,然后让用户下载,但是要在用户下载或是在线查看完毕后我要删除这个解过密的文件,请问我如何才能知道客户已经关闭在线查看或是已经下载完成了?如果得不到这个信息我没办法执行删除文件操作。。
解决方案 »
- 业务流程导致界面变化,如何减少后台代码变动!
- 初出菜鸟
- struts1 的 actionform 为null问题
- 新手请教LINUX的.SH文件问题
- log4j
- 各位高手帮我看看这个问题该怎么办?
- 有没有比较好的关于struts的tutorial
- 今天是我好朋友也是我同事工作一周年纪念日,散分庆祝!
- myeclipse 中点击右键没有add webproject Capabilities
- java调用shell脚本a.sh,a.sh里会调用expect,然后java就取不到返回值,直接报NULL,求大神帮忙
- 各位高手来吧,我有几个邪门的问题需要请教,分数都给出来了
- xfire生成客户端如何控制超时时间和次数?
直接写入数据库吧。用一个大字段存储。如Oracle的Clob
然后拿到文件之后,用base64加密,加密之后的字符串存到这个字段中,以后取出来的时候,解密,这样就行了
加密的方法:
//传入一个文件的路径,返回一个base64编码的字符流
public String getEncodedText(String filePath) {
String text = null;
InputStream in = null;
try {
in = new BufferedInputStream(new FileInputStream(filePath));
byte[] buffer = new byte[in.available()];
in.read(buffer);
BASE64Encoder encoder = new BASE64Encoder();
text = encoder.encode(buffer);
// System.out.println(text.length());
}catch (Exception e){
e.printStackTrace();
}finally {
if (in != null) {
try {
in.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
return text;
}以后要读出来的时候,从数据库中取出这个字符串进行解密
//base64Str 转换成的base64编码的字符流
//fileName 存放的文件名称,即把转换后的文件存在哪里
public boolean tranfile(String base64Str,String fileName){
sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
try{
byte[] b = decoder.decodeBuffer(base64Str);
ByteArrayInputStream in = new ByteArrayInputStream(b);
byte[] buffer = new byte[b.length];
FileOutputStream out = new FileOutputStream(fileName);
int bytesum = 0;
int byteread = 0;
while((byteread = in.read(buffer)) != -1) {
bytesum += byteread;
out.write(buffer, 0, byteread);
}
out.close();
}catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}