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