pise
pise

Reputation: 865

How to upload byte array using apache common vfs

I am stuck in uploading byte array using apache common vfs, below is the example uploading file using filepath, I googled but I am not getting the solution for file upload using byte array

    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;
}

The above example it took from here

and it is working fine.

Below is the code for uploading byte array using 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;
}

Upvotes: 0

Views: 2275

Answers (2)

Edu
Edu

Reputation: 160

This is an old question, but I was having the same problem and I was able to solve it without assuming a local file, e.g. using a ByteArrayInputStream, so this may be useful for someone having the same problem as pise. Basically, we can copy an input stream directly into the output stream of the remote file.

The code is this:

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");

Upvotes: 2

Andreas
Andreas

Reputation: 159086

See e.g. Example 6 on https://www.programcreek.com/java-api-examples/?api=org.apache.commons.vfs.FileContent:

/**
 * 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);
    }
}

Upvotes: 1

Related Questions