Как зашифровать Excel в InputStream и записать в OutputStream? - PullRequest
0 голосов
/ 05 февраля 2019

Я использую это в приложении, где запись в файл невозможна.Данные всегда в потоках.Я получаю файл 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();
    }
}

При чтении из файла и записи в файл он прекрасно шифруется.Но если я использую функцию, а затем получаю выходной поток, а затем пишу его, он создает файл с нулевым килобайтом.Это вообще возможно?

Я проверил код ниже, чтобы убедиться, что входной поток в порядке.

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

Мне удалось записать выходной поток в файл.

1 Ответ

0 голосов
/ 22 февраля 2019

Поскольку я не могу создавать файлы, а 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();
            }
        }
    });

Это сработало для меня.

...