如何使用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");