Java code to preallocate space for destination mainframe file using FTP
In my project I have faced a scenario such that , I need to upload a csv file from my java application to a mainframe system, I have Java code that uses the Apache commons net Ftp Client library to send a file to a mainframe. The code works perfectly for small sized files under 5 Mb. However, when it encounters a file over 5 Mb, it fails with a CopyStreamException.
** UPDATE: FTP Complete tutorial now available here.
Then I have gotten assistance from a mainframe expert, the mainframe person informed me that the format parameters and block-size of the file created on the mainframe were incorrect.
And so with the help of the mainframe expert , I have included the following codes in my ftp program,
ftpclient.sendSiteCommand("RECFM=FB");
ftpclient.sendSiteCommand("LRECL=2000");
ftpclient.sendSiteCommand("BLKSIZE=27000");
ftpclient.sendSiteCommand("CY");
ftpclient.sendSiteCommand("PRI= 50");
ftpclient.sendSiteCommand("SEC=25");
where
RECFM=FB -> record format , which implies the file format
LRECL=2000 -> Logical record length , which decides the length of a record
BLKSIZE=27000 -> Block size command use to set the block size of the content transferred
CY -> Allocated space in cylinders, and PRI= 50 is the primary allocation and SEC=25 is the secondary allocation , and RLSE is the release command.
Now my ftp program could able to transfer files over 5 MB to the main frame system.
File : FtpFileUpload.java
import java.io.IOException;
import java.io.File;
import java.io.FileInputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPConnectionClosedException;
class FTPFileUpload
{
public static void main(String[] args) throws IOException
{
FTPClient ftpclient = new FTPClient();
FileInputStream fis = null;
boolean result;
String ftpServerAddress = "localhost";
String userName = "admin";
String password = "admin";
try
{
ftpclient.connect(ftpServerAddress);
result = ftpclient.login(userName, password);
if (result == true)
{
System.out.println("Logged in Successfully !");
}
else
{
System.out.println("Login Fail!");
return;
}
ftpclient.setFileType(FTP.BINARY_FILE_TYPE);
// preallocate space in mainframe server using FTP
ftpclient.sendSiteCommand("RECFM=FB");
ftpclient.sendSiteCommand("LRECL=2000");
ftpclient.sendSiteCommand("BLKSIZE=27000");
ftpclient.sendSiteCommand("CY");
ftpclient.sendSiteCommand("PRI= 50");
ftpclient.sendSiteCommand("SEC=25");
ftpclient.changeWorkingDirectory("/");
File file = new File("D:/File.csv");
String testName = "PUBLIC.FILENAME.FILE1";
fis = new FileInputStream(file);
// Upload file to the ftp server
result = ftpclient.storeFile(testName, fis);
if (result == true) {
System.out.println("File is uploaded successfully");
}
else {
System.out.println("File uploading failed");
}
ftpclient.logout();
} catch (FTPConnectionClosedException e) {
System.out.println(e);
} finally {
try {
ftpclient.disconnect();
} catch (FTPConnectionClosedException e) {
System.out.println(e);
}
}
}
}