Как я могу создать и записать в файл CSV в удаленном месте, защищенном именем пользователя и паролем?

Мне нужно создать и заполнить файл CSV некоторыми данными, а затем поместить его в удаленное место, защищенное именем пользователя и паролем, на клиентском компьютере. Я использую apache-commons CSVPrinter для записи файла. Запланированное задание записывает файл, но я не могу пройти процесс аутентификации.

UserAuthenticator auth = new StaticUserAuthenticator(domain, userName, password);
FileSystemOptions opts = new FileSystemOptions();

DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
FileObject fo = VFS.getManager().resolveFile(exportLocation + fileName, opts);

BufferedWriter writer = Files.newBufferedWriter(Paths.get(fo.getURL().getPath()), StandardCharsets.UTF_8);

CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withDelimiter(';'));

Я получаю java.nio.file.AccessDeniedException с верхним кодом. Может ли кто-нибудь посоветовать мне, как подойти к проблеме, и сказать мне, что я делаю неправильно?

******************************************************* ** ИЗМЕНИТЬ ******************************************* ****************

Я обновил код до:

UserAuthenticator auth = new StaticUserAuthenticator(domain, userName, password);
FileSystemOptions opts = new FileSystemOptions();

DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
FileObject fo = VFS.getManager().resolveFile(exportLocation + fileName, opts);
FileContent fileContent = fo.getContent();

CSVPrinter csvPrinter = new CSVPrinter((Appendable) fileContent.getOutputStream(),
                    CSVFormat.DEFAULT.withDelimiter(';'));

Я избавился от BufferedWriter и заменил его экземпляром FileContent. Теперь я получаю org.apache.commons.vfs2.FileSystemException: Could not write to "file:////*PATH*/*TO*/*CSV_FILE*.csv".

Теперь мой путь к файлу .csv содержит две обратные косые черты в начале, потому что, если я их удалю, строка FileObject fo = VFS.getManager().resolveFile(exportLocation + fileName, opts); создаст следующее исключение: org.apache.commons.vfs2.FileSystemException: Could not find file with URI "*PATH*\*TO*\*CSV_FILE*.csv" because it is a relative path, and no base URI was provided. Естественно, это происходит потому, что две обратные косые черты указывают на файл в папке, а не на URI.

Теперь моя проблема: как я могу сохранить обратную косую черту для нужной строки и удалить их при записи в файл в этой строке: CSVPrinter csvPrinter = new CSVPrinter((Appendable) fileContent.getOutputStream(), CSVFormat.DEFAULT.withDelimiter(';'));?

Кроме того, теперь я вижу, что это последнее исключение было вызвано следующим: java.io.FileNotFoundException: *PATH*\*TO*\*CSV_FILE*.csv (Access is denied) что означало бы, что я все еще не смог пройти аутентификацию.


person mdenci    schedule 06.02.2020    source источник


Ответы (1)


Ну, я отказался от этого подхода, поэтому я попытался использовать jcifs, и он заработал.

CIFSContext base = SingletonContext.getInstance();
CIFSContext authed1 = base.withCredentials(new NtlmPasswordAuthenticator(domain, userName, password));

SmbFile sFile = new SmbFile("smb://" + exportLocation + fileName, authed1);
SmbFileOutputStream sfos = new SmbFileOutputStream(sFile);
OutputStreamWriter out = new OutputStreamWriter(sfos);

CSVPrinter csvPrinter = new CSVPrinter(out, CSVFormat.DEFAULT.withDelimiter(';'));

Извините, я не мог понять, что не так с моим кодом apache-commons-vfs.

person mdenci    schedule 06.02.2020
comment
Проблема с использованием JCIFS заключается в том, что используется только диалект SMB1, который больше не поддерживается большинством операционных систем. Так что, если однажды ваше приложение перестанет работать, вы поймете, почему. Вы можете поискать в сети другие реализации SMB, поддерживающие диалекты SMB2 и SMB3. - person Eliad Cohen; 07.02.2020
comment
@EliadCohen Я использовал JCIFS-NG с поддержкой SMB2. - person mdenci; 07.02.2020
comment
@EliadCohen: есть также jcifs 2.x, который разветвляется от jcifs-ng и поддерживает SMB 2.0, даже некоторые части SMB 3.0. См. github.com/codelibs/jcifs. - person Jan Zyka; 25.09.2020