The following is an example of a component that handles file uploads. One way to use this component is through a form element such as the one presented in the previous example. The example here includes two alternatives, one that returns the uploaded file as a byte array and one (which is commented out) where the uploaded file is read from the input stream.
import atg.servlet.UploadedFile; import java.io.*; import atg.droplet.GenericFormHandler; public class FileUploadComponent extends GenericFormHandler { /** * This method is called when the form above is submitted. This code makes * sure that it has an appropriate object and then pass it along for further * processing. * @param Object either an UploadedFile or an UploadedFile[] **/ public void setUploadProperty(Object fileObject) { if(fileObject == null) { System.err.println("**** ERROR: FileUploadDroplet received a NULL file."); return; } if (fileObject instanceof UploadedFile[]) { System.out.println("Reading in UploadedFile[]"); readUpFiles((UploadedFile[]) fileObject); }else if (fileObject instanceof UploadedFile){ readUpFiles(new UploadedFile[]{(UploadedFile)fileObject}); }else{ System.err.print ("**** ERROR: FileUploadDroplet received an Object which is " + "neither an UploadedFile or an UploadedFile[]."); } } /** * Returns property UploadProperty **/ public Object getUploadProperty() { // return null since we don't need to maintain a // reference to the original uploaded file(s) return null; } //------------------------------------- /** * Here you can access the data in the uploaded file(s). You * should get the data from the uploaded file before the * request is complete. If the file is large, it is stored as a temporary * file on disk, and this file is removed when the request is complete. * @param UploadedFile[] the uploaded file(s) **/ void readUpFiles(UploadedFile[] pFiles){ UploadedFile upFile = null; String clientFilePath = null; String fileName = null; File localFile = null; FileOutputStream fos = null; byte[] fileData = null; for (int i = 0; i < pFiles.length; i++){ upFile = pFiles[i]; clientFilePath = upFile.getFilename(); // Check that file uploaded is not size 0. if(upFile.getFileSize() <= 0){ System.err.println (" FileUploadDroplet Cannot upload - file has length 0: " + clientFilePath); return; } /** * Extract the FilePath, which is the file location provided by the * browser client. Convert the file separator character to use the one * accepted by the web client's Operating system. **/ String otherSeparator = "/"; if ( "/".equals(File.separator)) otherSeparator = "\\"; String convertedClientFilePath = atg.core.util.StringUtils.replace (clientFilePath,otherSeparator,File.separator); fileName = new String (convertedClientFilePath.substring (convertedClientFilePath.lastIndexOf (File.separator)+1)); // Construct a local file (using the uploaded file directory) localFile = new File (mUploadDirectory + File.separator + fileName); // You can either get the file as an array of bytes ... try { fileData = upFile.toByteArray(); System.out.println (" ** client filename: " + clientFilePath); System.out.println (" ** client file is " + upFile.getFileSize() + " bytes long."); fos = new FileOutputStream(localFile); fos.write(fileData); fos.flush(); } catch (IOException e) { System.err.println("FileUploadDroplet failed"); e.printStackTrace(); } finally { if (fos != null){ try { fos.close(); }catch(IOException exc) { exc.printStackTrace(); } }//end try/catch }//end finally // ... or you can read the data yourself from the input stream. /** try{ InputStream is = upFile.getInputStream(); ... } catch (IOException e) { } **/ }// end for }// end readUpFiles //------------------------------------- // property: UploadDirectory // where we will put the uploaded file String mUploadDirectory; /** * Sets property UploadDirectory **/ public void setUploadDirectory(String pUploadDirectory) { mUploadDirectory = pUploadDirectory; } /** * Returns property UploadDirectory **/ public String getUploadDirectory() { return mUploadDirectory; } }