我想把本地图片加密 点图片的时候,看不到图片还有修改后缀名也不行 只有在WEB页面才能看 谁会的可以帮帮忙

解决方案 »

  1.   

    方法是把图片保存为本地非web目录,或者数据库二进制字段(如blob).访问图片的时候,用servlet以流的方式输出就可以了。
      

  2.   


    public class ZipEncrypt {
    private void directoryZip(ZipOutputStream out, File f, String base)
    throws Exception {
    // 如果传入的是目录
    if (f.isDirectory()) {
    File[] fl = f.listFiles();
    // 创建压缩的子目录
    out.putNextEntry(new ZipEntry(base + "/"));
    if (base.length() == 0) {
    base = "";
    } else {
    base = base + "/";
    }
    for (int i = 0; i < fl.length; i++) {
    directoryZip(out, fl[i], base + fl[i].getName());
    }
    } else {
    // 把压缩文件加入rar中
    out.putNextEntry(new ZipEntry(base));
    FileInputStream in = new FileInputStream(f);
    byte[] bb = new byte[2048];
    int aa = 0;
    while ((aa = in.read(bb)) != -1) {
    out.write(bb, 0, aa);
    }
    in.close();
    }
    } /**
     * @方法名: fileZip
     * @功能:压缩文件
     * @param zos
     * @param file
     * @throws Exception
     * @返回类型 void
     */
    private void fileZip(ZipOutputStream zos, File file) throws Exception {
    if (file.isFile()) {
    zos.putNextEntry(new ZipEntry(file.getName()));
    FileInputStream fis = new FileInputStream(file);
    byte[] bb = new byte[2048];
    int aa = 0;
    while ((aa = fis.read(bb)) != -1) {
    zos.write(bb, 0, aa);
    }
    fis.close();
    } else {
    directoryZip(zos, file, "");
    }
    } /**
     * @方法名: fileUnZip
     * @功能:解压缩文件
     * @param zis
     * @param file
     * @throws Exception
     * @返回类型 void
     */
    private void fileUnZip(ZipInputStream zis, File file) throws Exception {
    ZipEntry zip = zis.getNextEntry();
    if (zip == null)
    return;
    String name = zip.getName();
    File f = new File(file.getAbsolutePath() + "/" + name);
    if (zip.isDirectory()) {
    f.mkdirs();
    fileUnZip(zis, file);
    } else {
    f.createNewFile();
    FileOutputStream fos = new FileOutputStream(f);
    byte b[] = new byte[2048];
    int aa = 0;
    while ((aa = zis.read(b)) != -1) {
    fos.write(b, 0, aa);
    }
    fos.close();
    fileUnZip(zis, file);
    }
    } /**
     * @方法名: zip
     * @功能:对directory目录下的文件压缩,保存为指定的文件zipFile
     * @param directory
     * @param zipFile
     * @返回类型 void
     */
    private void zip(String directory, String zipFile) {
    try {
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
    zipFile));
    fileZip(zos, new File(directory));
    zos.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    } /**
     * @方法名: unZip
     * @功能:解压缩文件zipFile保存在directory目录下
     * @param directory
     * @param zipFile
     * @返回类型 void
     */
    private void unZip(String directory, String zipFile) {
    try {
    ZipInputStream zis = new ZipInputStream(
    new FileInputStream(zipFile));
    File f = new File(directory);
    f.mkdirs();
    fileUnZip(zis, f);
    zis.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    } /**
     * @方法名: getKey
     * @功能:根据key的路径文件获得持久化成文件的key 例子:
     *                            RsaEncrypt.getKey("c:/systemkey/private.key");
     * @param keyPath
     * @return
     * @throws Exception
     * @返回类型 Key
     */
    private Key getKey(String keyPath) throws Exception {
    FileInputStream fis = new FileInputStream(keyPath);
    byte[] b = new byte[16];
    fis.read(b);
    SecretKeySpec dks = new SecretKeySpec(b, "AES");
    fis.close();
    return dks;
    } /**
     * @方法名: encrypt
     * @功能:把文件srcFile加密后存储为destFile
     * @param srcFile
     * @param destFile
     * @param privateKey
     * @throws Exception
     * @返回类型 void
     */
    private void encrypt(String srcFile, String destFile, Key privateKey)
    throws Exception {
    SecureRandom sr = new SecureRandom();
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    IvParameterSpec spec = new IvParameterSpec(privateKey.getEncoded());
    cipher.init(Cipher.ENCRYPT_MODE, privateKey, spec, sr);
    FileInputStream fis = new FileInputStream(srcFile);
    FileOutputStream fos = new FileOutputStream(destFile);
    byte[] b = new byte[2048];
    while (fis.read(b) != -1) {
    fos.write(cipher.doFinal(b));
    }
    fos.close();
    fis.close();
    } /**
     * @方法名: decrypt
     * @功能:把文件srcFile解密后存储为destFile
     * @param srcFile
     * @param destFile
     * @param privateKey
     * @throws Exception
     * @返回类型 void
     */
    private void decrypt(String srcFile, String destFile, Key privateKey)
    throws Exception {
    SecureRandom sr = new SecureRandom();
    Cipher ciphers = Cipher.getInstance("AES/CBC/PKCS5Padding");
    IvParameterSpec spec = new IvParameterSpec(privateKey.getEncoded());
    ciphers.init(Cipher.DECRYPT_MODE, privateKey, spec, sr);
    FileInputStream fis = new FileInputStream(srcFile);
    FileOutputStream fos = new FileOutputStream(destFile);
    byte[] b = new byte[2064];
    while (fis.read(b) != -1) {
    fos.write(ciphers.doFinal(b));
    }
    fos.close();
    fis.close();
    } /**
     * @方法名: encryptZip
     * @功能:对目录srcFile下的所有文件目录进行先压缩后操作,然后保存为destfile
     * @param srcFile
     *            要操作的目录 如c:/test/test
     * @param destfile
     *            压缩加密后存放的文件名 如c:/加密压缩文件.zip
     * @param keyfile
     *            公钥存放地点
     * @throws Exception
     * @返回类型 void
     */
    public void encryptZip(String srcFile, String destfile, String keyfile)
    throws Exception {
    SecureRandom sr = new SecureRandom();
    KeyGenerator kg = KeyGenerator.getInstance("AES");
    kg.init(128, sr);
    SecretKey key = kg.generateKey();
    File f = new File(keyfile);
    if (!f.getParentFile().exists())
    f.getParentFile().mkdirs();
    f.createNewFile();
    FileOutputStream fos = new FileOutputStream(f);
    fos.write(key.getEncoded());
    File temp = new File(UUID.randomUUID().toString() + ".cyl");
    temp.deleteOnExit();
    // 先压缩文件
    zip(srcFile, temp.getAbsolutePath());
    // 对文件加密
    encrypt(temp.getAbsolutePath(), destfile, key);
    temp.delete();
    } /**
     * @方法名: decryptUnzip
     * @功能:对文件srcfile进行先解密后解压缩,然后解压缩到目录destfile下
     * @param srcfile
     *            要解密和解压缩的文件名 如c:/目标.zip
     * @param destfile
     *            解压缩后的目录 如c:/abc
     * @param keyfile
     *            公钥
     * @throws Exception
     * @返回类型 void
     */
    public void decryptUnzip(String srcfile, String destfile, String keyfile)
    throws Exception {
    // 先对文件解密
    File temp = new File(UUID.randomUUID().toString() + ".cyl");
    temp.deleteOnExit();
    decrypt(srcfile, temp.getAbsolutePath(), this.getKey(keyfile));
    // 解压缩
    unZip(destfile, temp.getAbsolutePath());
    temp.delete();
    } /**
     * @方法名: main
     * @功能:測試類
     * @param args
     * @throws Exception
     * @返回类型 void
     */
    public static void main(String args[]) throws Exception {
    /**
     * 文件加密压缩
     */
    long a = System.currentTimeMillis();
    // 參數:要操作的目录/压缩加密后存放的文件名/公钥存放地点
    new ZipEncrypt().encryptZip("e:/com", "e:/comXXX/page.cyl",
    "e:/comXXX/public.key"); System.out.println("压缩并加密所用的毫秒数:"
    + String.valueOf(System.currentTimeMillis() - a) + "ms");

    /**
     * 文件解密解压
     */
    a = System.currentTimeMillis(); // 參數:要解密和解压缩的文件名/解压缩后的目录/公钥
    new ZipEncrypt().decryptUnzip("e:/comXXX/page.cyl", "e:/comxxx",
    "e:/comXXX/public.key");
    System.out.println("解密并解压所用的毫秒数:"
    + String.valueOf(System.currentTimeMillis() - a) + "ms"); }