如何使用apache common vfs上传字节数组
How to upload byte array using apache common vfs
我被困在使用 apache common vfs 上传字节数组,下面是使用文件路径上传文件的示例,我用谷歌搜索但我没有得到使用字节数组上传文件的解决方案
public static boolean upload(String localFilePath, String remoteFilePath) {
boolean result = false;
File file = new File(localFilePath);
if (!file.exists())
throw new RuntimeException("Error. Local file not found");
try (StandardFileSystemManager manager = new StandardFileSystemManager();
// Create local file object
FileObject localFile = manager.resolveFile(file.getAbsolutePath());
// Create remote file object
FileObject remoteFile = manager.resolveFile(
createConnectionString(hostName, username, password, remoteFilePath),
createDefaultOptions());) {
manager.init();
// Copy local file to sftp server
remoteFile .copyFrom(localFile, Selectors.SELECT_SELF);
result = true;
} catch (Exception e) {
throw new RuntimeException(e);
}
return result;
}
上面的例子取自here
它工作正常。
下面是使用FTPSClient上传字节数组的代码
private boolean uploadFtp(FTPSClient ftpsClient, byte[] fileData, String fileName) {
boolean completed = false;
byte[] bytesIn = new byte[4096];
try (InputStream inputStream = new ByteArrayInputStream(fileData); OutputStream outputStream =
ftpsClient.storeFileStream(fileName);) {
int read = 0;
while ((read = inputStream.read(bytesIn)) != -1) {
outputStream.write(bytesIn, 0, read);
}
completed = ftpsClient.completePendingCommand();
if (completed) {
logger.info("File uploaded successfully societyId");
}
} catch (IOException e) {
logger.error("Error while uploading file to ftp server", e);
}
return completed;
}
参见例如https://www.programcreek.com/java-api-examples/?api=org.apache.commons.vfs.FileContent 上的示例 6:
/**
* Write the byte array to the given file.
*
* @param file The file to write to
* @param data The data array
* @throws IOException
*/
public static void writeData(FileObject file, byte[] data)
throws IOException {
OutputStream out = null;
try {
FileContent content = file.getContent();
out = content.getOutputStream();
out.write(data);
} finally {
close(out);
}
}
这是一个老问题,但我遇到了同样的问题,我能够在不假设本地文件的情况下解决它,例如使用 ByteArrayInputStream,因此这对于遇到与 pise 相同问题的人可能有用。
基本上,我们可以将输入流直接复制到远程文件的输出流中。
代码是这样的:
InputStream is = ... // you only need an input stream, no local file, e.g. ByteArrayInputStream
DefaultFileSystemManager fsmanager = (DefaultFileSystemManager) VFS.getManager();
FileSystemOptions opts = new FileSystemOptions();
FtpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true);
StaticUserAuthenticator auth = new StaticUserAuthenticator(host, username, password);
DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
String ftpurl = "ftp://" + host + ":" + port + "/" + folder + "/" + filename;
FileObject remoteFile = fsmanager.resolveFile(ftpurl, opts);
try (OutputStream ostream = remoteFile.getContent().getOutputStream()) {
// either copy input stream manually or with IOUtils.copy()
IOUtils.copy(is, ostream);
}
boolean success = remoteFile.exists();
long size = remoteFile.getContent().getSize();
System.out.println(success ? "Successful, copied " + size + " bytes" : "Failed");
我被困在使用 apache common vfs 上传字节数组,下面是使用文件路径上传文件的示例,我用谷歌搜索但我没有得到使用字节数组上传文件的解决方案
public static boolean upload(String localFilePath, String remoteFilePath) {
boolean result = false;
File file = new File(localFilePath);
if (!file.exists())
throw new RuntimeException("Error. Local file not found");
try (StandardFileSystemManager manager = new StandardFileSystemManager();
// Create local file object
FileObject localFile = manager.resolveFile(file.getAbsolutePath());
// Create remote file object
FileObject remoteFile = manager.resolveFile(
createConnectionString(hostName, username, password, remoteFilePath),
createDefaultOptions());) {
manager.init();
// Copy local file to sftp server
remoteFile .copyFrom(localFile, Selectors.SELECT_SELF);
result = true;
} catch (Exception e) {
throw new RuntimeException(e);
}
return result;
}
上面的例子取自here
它工作正常。
下面是使用FTPSClient上传字节数组的代码
private boolean uploadFtp(FTPSClient ftpsClient, byte[] fileData, String fileName) {
boolean completed = false;
byte[] bytesIn = new byte[4096];
try (InputStream inputStream = new ByteArrayInputStream(fileData); OutputStream outputStream =
ftpsClient.storeFileStream(fileName);) {
int read = 0;
while ((read = inputStream.read(bytesIn)) != -1) {
outputStream.write(bytesIn, 0, read);
}
completed = ftpsClient.completePendingCommand();
if (completed) {
logger.info("File uploaded successfully societyId");
}
} catch (IOException e) {
logger.error("Error while uploading file to ftp server", e);
}
return completed;
}
参见例如https://www.programcreek.com/java-api-examples/?api=org.apache.commons.vfs.FileContent 上的示例 6:
/**
* Write the byte array to the given file.
*
* @param file The file to write to
* @param data The data array
* @throws IOException
*/
public static void writeData(FileObject file, byte[] data)
throws IOException {
OutputStream out = null;
try {
FileContent content = file.getContent();
out = content.getOutputStream();
out.write(data);
} finally {
close(out);
}
}
这是一个老问题,但我遇到了同样的问题,我能够在不假设本地文件的情况下解决它,例如使用 ByteArrayInputStream,因此这对于遇到与 pise 相同问题的人可能有用。 基本上,我们可以将输入流直接复制到远程文件的输出流中。
代码是这样的:
InputStream is = ... // you only need an input stream, no local file, e.g. ByteArrayInputStream
DefaultFileSystemManager fsmanager = (DefaultFileSystemManager) VFS.getManager();
FileSystemOptions opts = new FileSystemOptions();
FtpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true);
StaticUserAuthenticator auth = new StaticUserAuthenticator(host, username, password);
DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
String ftpurl = "ftp://" + host + ":" + port + "/" + folder + "/" + filename;
FileObject remoteFile = fsmanager.resolveFile(ftpurl, opts);
try (OutputStream ostream = remoteFile.getContent().getOutputStream()) {
// either copy input stream manually or with IOUtils.copy()
IOUtils.copy(is, ostream);
}
boolean success = remoteFile.exists();
long size = remoteFile.getContent().getSize();
System.out.println(success ? "Successful, copied " + size + " bytes" : "Failed");