如何在InputStream中加密Excel并写入OutputStream?

时间:2019-02-05 04:23:16

标签: java excel encryption apache-poi

我在无法写入文件的应用程序中使用它。数据始终在流中。我在输入流中获取了XLSX文件,我想设置一个密码并将其写入输出流。

public void encrptXslxFile(InputStream inStream, OutputStream outStream){ 
    POIFSFileSystem fs = null;
    EncryptionInfo info = null;
    OutputStream fos;
    OPCPackage opc = null;

    try {
        info = new EncryptionInfo(EncryptionMode.agile);
        Encryptor enc = info.getEncryptor();
        enc.confirmPassword("coffee");
        //inStream = new FileInputStream("C:\\ProjectWork\\Community\\excelfile.xlsx");
        fs = new POIFSFileSystem();
        opc = OPCPackage.open(inStream); //from parameter
        OutputStream os = enc.getDataStream(fs);
        opc.save(os);
        os.close();

        //fos = new FileOutputStream("C:\\ProjectWork\\Community\\excelfilepwd.xlsx");
        //fs.writeFilesystem(fos);
        //fos.close();

        fs.writeFilesystem(outStream); // from parameter
        outStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

从文件读取并写入文件时,它可以很好地加密。但是,如果我使用该函数然后获取输出流,然后再编写它,它将创建一个零kb文件。 这有可能吗?

我使用以下代码进行了测试,以确保输入流良好。

public void encrptXslxFile(InputStream inStream, OutputStream outStream){     
    try {
        IOUtils.copy(inStream, outStream);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我能够将输出流写入文件。

1 个答案:

答案 0 :(得分:0)

由于我无法创建文件并且POI在内部使用文件,因此我必须专门设置临时目录以供POI使用。

   TempFile.setTempFileCreationStrategy(new TempFileCreationStrategy() {

        @Override
        public File createTempFile(String prefix, String suffix) throws IOException {
            // check dir exists, make if doesn't
            if(!fileTempDir.exists()){
                fileTempDir.mkdir();
                fileTempDir.deleteOnExit();
            }

            File newFile = File.createTempFile(prefix, suffix, fileTempDir);
            return newFile;
        }

        @Override
        public File createTempDirectory(String strPath) throws IOException {
            if(!fileTempDir.exists()){
                fileTempDir.mkdir();
                fileTempDir.deleteOnExit();
                return fileTempDir;
            }else {
                return Files.createTempDirectory(strPath).toFile();
            }
        }
    });

这对我有用。