最近在用别人的平台做一个系统,客户要求所有的附件需要加密存储,也就是在服务器上不能能看可以直接查看的文件,我现在加密是这样做的。当客户上传一个文件后,我会调用加密方法把这个文件写到另一个新的文件里,然后把客户上传的未加密文件删除,再把我加过密的文件名改为客户上传的文件名了,这样就实现了加密,下载的路径也不会错,但是在下载的时候就出现问题了,客户要下载下来的文件是非加密的。也就是说客户在下载之前我需要将此文件进行解密,我现在的思路还是和加密一样,把加过密的文件读出来生成一个新的解密文件,然后让用户下载,但是要在用户下载或是在线查看完毕后我要删除这个解过密的文件,请问我如何才能知道客户已经关闭在线查看或是已经下载完成了?如果得不到这个信息我没办法执行删除文件操作。。

解决方案 »

  1.   

    给个建议:
    直接写入数据库吧。用一个大字段存储。如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;
       }