Запись / загрузка файла с помощью Samba / jcifs issue (SmbAuthException: Доступ запрещен)
поэтому я пытаюсь написать файл с устройства android в общую папку windows. Я использую последнюю версию JCIFS и код, который отображает доступные сетевые ресурсы работает нормально. Поэтому я предполагаю, что все в порядке с JCIFS и с моей LAN, WiFi и т. д. Вот код для загрузки файла (на самом деле я просто хочу написать текст, источник в файл):
public boolean save2Samba(String text, String fileName) {
try {
// My Windows shares doesn't require any login/password
// String name="login";//my windows username
// String password="password1";//my windows password
// sSambaFolder contains a path like MYPC/E/SharedFolderName/
String url = "smb://" + sSambaFolder.toLowerCase()+fileName;
SmbFile file = null;
try {
// assume ANONYMOUS is my case but there is no description of this in JCIFS API
NtlmPasswordAuthentication auth = NtlmPasswordAuthentication.ANONYMOUS;
file = new SmbFile(url, auth);
android.util.Log.i("TestApp",url);
// output is like smb://mypc/e/sharedfoldername/file.txt;
SmbFileOutputStream out = new SmbFileOutputStream(file);
out.write(text.getBytes());
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
поскольку url зарегистрирован, я уверен, что это правильно (также я проверил url, используя код, который я упомянул выше, и он просматривает содержимое папки).
Но проблема в том, что я всегда получаю то же самое:
W/System.err(3214): jcifs.smb.SmbAuthException: Access is denied.
акции не защищены паролем, поэтому мне не нужно имя пользователя / пароль для получения доступа. Я мог читать/писать / удалять файлы из другого WinPC, и авторизация не требуется. Также я попытался создать пароль для пользователя на WinPC с акциями, но результат был тот же. Поэтому я попробовал несколько версий NtlmPasswordAuthentication без успеха:
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("");
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(":");
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("Administrator:"); //actual username on WinPC with shares
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("Administrator");
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null,"Administrator","");
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null,"","");
так что же я делаю неправильно и как достичь моей цели, когда нет auth требуется, чтобы получить доступ к общей папке?
BTW мой Samsung TV, который основан на linux и использует клиент samba, получает доступ к той же общей папке без проблем и воспроизводит MP3 оттуда (Ну, да, он только читает). Поскольку мое устройство AOS получает доступ к моей локальной сети через WiFi (вместо телевизора, который подключен через Ethernet), я также проверил доступ к общей папке с помощью ноутбука+WiFi и не нашел проблем.
добавлено:
Я теперь попробуйте выполнить следующие строки:
file = new SmbFile(url, auth);
android.util.Log.i("save2Samba", "file.exists(): " + file.exists());
и получение того же доступа отказано. Я даже не пытаюсь писать файл...
2 ответов
OMG!!! Решение было таким простым!!! Для доступа к сети, которая не защищена логином / паролем и, следовательно, не нуждается в авторизации, не является NtlmPasswordAuthentication.Анонимно, но это:
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, null, null);
попробуйте с этим кодом
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("",
username, password);
sharepath = "smb://" + pathtosharefolder + test.txt;
sFile = new SmbFile(sharepath, auth);
SmbFileOutputStream out = new SmbFileOutputStream(file, true);
out.write(text.getBytes());
также проверьте, что у вас есть общий путь к папке, к которой вы обращаетесь. Также проверьте, что он дал разрешение на запись в папку