我可以将文件从共享复制到本地。但我想切换,并将文件从本地复制到共享。
I am trying this code:
SmbFile oldFile = new SmbFile("c:/tmp/test.xml");
SmbFile newFile = new SmbFile("smb://someone_pc/tmp/test.xml", new NtlmPasswordAuthentication("", username, password));
oldFile.copyTo(newFile);
但我在copyTo
方法上遇到例外:
Invalid operation for workgroups or servers
如何将文件从本地复制到共享?
答案 0 :(得分:3)
使用Javi_Swift之类的流,通过SMB协议将文件从本地文件复制到共享磁盘的完整解决方案(部分书写 - 无法将整个文件加载到内存中的大文件解决方案):
// local source file and target smb file
File fileSource = new File("C:/example.jpg");
SmbFile smbFileTarget = new SmbFile(smbFileContext, "example.jpg");
// input and output stream
FileInputStream fis = new FileInputStream(fileSource);
SmbFileOutputStream smbfos = new SmbFileOutputStream(smbFileTarget);
// writing data
try {
// 16 kb
final byte[] b = new byte[16*1024];
int read = 0;
while ((read=fis.read(b, 0, b.length)) > 0) {
smbfos.write(b, 0, read);
}
}
finally {
fis.close();
smbfos.close();
}
答案 1 :(得分:2)
前一段时间我和jcifs合作过。
您可以尝试newFile.createNewFile();
然后使用copyTo
。
如果这不起作用,请尝试newFile.getOutputStream()
并将数据写入此流而不是使用copyTo
。
答案 2 :(得分:1)
我参加聚会有点晚了,但这可能对其他人提出这个问题很有用。
我使用流将文件从本地上传到共享,并且它没有任何问题。我的代码是:
SmbFile remoteFile = new SmbFile(remotePath, auth);
SmbFileOutputStream out = new SmbFileOutputStream(remoteFile);
FileInputStream fis = new FileInputStream(localFile);
out.write(IOUtils.toByteArray(fis));
out.close();
答案 3 :(得分:1)
使用Java 1.7' Files类:
的示例Path source = Paths.get("c:/tmp/test.xml");
SmbFile newFile = new SmbFile("smb://someone_pc/tmp/test.xml", new NtlmPasswordAuthentication("", username, password));
try (OutputStream out = newFile.getOutputStream())
{
Files.copy(source, out);
}
答案 4 :(得分:0)
public void uploadToSmb(String destinationPath,File localFile){
public final static byte[] BUFFER = new byte[10 * 8024];
ByteArrayInputStream inputStream = null;
SmbFileOutputStream sfos = null;
try {
String user = username + ":" + password;
int lenghtOfFile = (int) localFile.length();
byte[] data = FileUtils.readFileToByteArray(localFile);
inputStream = new ByteArrayInputStream(data);
String path = destinationPath + localFile.getName();
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(user);
remoteFile = new SmbFile(path, auth);
sfos = new SmbFileOutputStream(remoteFile);
long total = 0;
while ((count = inputStream.read(BUFFER)) > 0) {
total += count;
// publishing the progress....
// After this onProgressUpdate will be called
int percentage = (int) ((total / (float) lenghtOfFile) * 100);
publishProgress(percentage);
// publishProgress((int) ((total * 100) / lenghtOfFile));
// writing data to file
sfos.write(BUFFER,0,count);
}
sfos.flush();
inputStream.close();
sfos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
这段代码工作得很好......