Search code examples
javafile-uploadapache-poistruts

read the contents of a file upload in java


I know how to upload a file:

<html>
<head>
<title>File Uploading Form</title>
</head>
<body>

<form action="UploadServlet" method="post"
                        enctype="multipart/form-data">

File :<input type="file" name="file" size="50" />

<input type="submit" value="Upload File"/>


</form>
</body>
</html>

This is the class for reading the file:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderExample {

    public static void main(String[] args) {

        try (BufferedReader br = new BufferedReader(new FileReader("C:\\testing.txt")))
        {

            String sCurrentLine;

            while ((sCurrentLine = br.readLine()) != null) {
                System.out.println(sCurrentLine);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } 

    }
}

Now how do you link both these together. The user uploads the file onto the server and the server processes it. i.e., it accepts the file and prints it contents. Can I use struts framework for this? I want to upload excel sheet and print the contents to the jsp page. I have the code for reading the excel sheet in java using apache poi. But the path to read the excel file is hard coded. how do you take it from the uploaded file?

This is the file for reading excel sheet:

public class ReadExcelDemo
{
    public static void main(String[] args)
    {
        try
        {
            FileInputStream file = new FileInputStream(new File("howtodoinjava_demo.xlsx"));

            //Create Workbook instance holding reference to .xlsx file
            XSSFWorkbook workbook = new XSSFWorkbook(file);

            //Get first/desired sheet from the workbook
            XSSFSheet sheet = workbook.getSheetAt(0);

            //Iterate through each rows one by one
            Iterator<Row> rowIterator = sheet.iterator();
            while (rowIterator.hasNext())
            {
                Row row = rowIterator.next();
                //For each row, iterate through all the columns
                Iterator<Cell> cellIterator = row.cellIterator();

                while (cellIterator.hasNext())
                {
                    Cell cell = cellIterator.next();
                    //Check the cell type and format accordingly
                    switch (cell.getCellType())
                    {
                        case Cell.CELL_TYPE_NUMERIC:
                            System.out.print(cell.getNumericCellValue() + "t");
                            break;
                        case Cell.CELL_TYPE_STRING:
                            System.out.print(cell.getStringCellValue() + "t");
                            break;
                    }
                }
                System.out.println("");
            }
            file.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

Output:

ID NAME LASTNAME 1.0 Amit Shukla 2.0 Lokesh Gupta
3.0 John Adwards 4.0 Brian Schultz

But how do you stitch the uploaded and the servlet file together. How do you read the uploaded file?


Solution

  • I got it. The index file(html) is for uploading the file (as above in my qquestion) The java class for it is:

    import java.io.*;
    import java.util.*;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.apache.commons.io.output.*;
    
    public class UploadServlet extends HttpServlet {
    
       private boolean isMultipart;
       private String filePath;
       private int maxFileSize = 50 * 1024;
       private int maxMemSize = 4 * 1024;
       private File file ;
    
       public void init( ){
          // Get the file location where it would be stored.
          filePath = 
                 getServletContext().getInitParameter("file-upload"); 
       }
       public void doPost(HttpServletRequest request, 
                   HttpServletResponse response)
                  throws ServletException, java.io.IOException {
          // Check that we have a file upload request
    
    
          isMultipart = ServletFileUpload.isMultipartContent(request);
          response.setContentType("text/html");
          java.io.PrintWriter out = response.getWriter( );
          if( !isMultipart ){
             out.println("<html>");
             out.println("<head>");
             out.println("<title>Servlet upload</title>");  
             out.println("</head>");
             out.println("<body>");
             out.println("<p>No file uploaded</p>"); 
             out.println("</body>");
             out.println("</html>");
             return;
          }
          DiskFileItemFactory factory = new DiskFileItemFactory();
          // maximum size that will be stored in memory
          factory.setSizeThreshold(maxMemSize);
          // Location to save data that is larger than maxMemSize.
          factory.setRepository(new File("c:\\temp"));
    
          // Create a new file upload handler
          ServletFileUpload upload = new ServletFileUpload(factory);
          // maximum file size to be uploaded.
          upload.setSizeMax( maxFileSize );
    
          try{ 
          // Parse the request to get file items.
          List fileItems = upload.parseRequest(request);
    
          // Process the uploaded file items
          Iterator i = fileItems.iterator();
    
          out.println("<html>");
          out.println("<head>");
          out.println("<title>Servlet upload</title>");  
          out.println("</head>");
          out.println("<body>");
          String fileName = "";
          while ( i.hasNext () ) 
          {
             FileItem fi = (FileItem)i.next();
             if ( !fi.isFormField () )  
             {
                // Get the uploaded file parameters
                String fieldName = fi.getFieldName();
                 fileName = fi.getName();
                String contentType = fi.getContentType();
                boolean isInMemory = fi.isInMemory();
                long sizeInBytes = fi.getSize();
                // Write the file
                if( fileName.lastIndexOf("\\") >= 0 ){
                   file = new File( filePath + 
                   fileName.substring( fileName.lastIndexOf("\\"))) ;
                }else{
                   file = new File( filePath + 
                   fileName.substring(fileName.lastIndexOf("\\")+1)) ;
                }
                fi.write( file ) ;
                out.println("Uploaded Filename: " + fileName + "<br>");
                out.println("Uploaded in location: "+filePath);
             }
          }
          out.println("</body>");
          out.println("</html>");
          ReadExcelDemo rd = new ReadExcelDemo();
          System.out.println("file name: "+fileName.substring(fileName.lastIndexOf("\\")));
          String s = fileName.substring(fileName.lastIndexOf("\\"));
          System.out.println(filePath);
          System.out.println(s);
          String fileP = filePath.concat(s+"\\");
    
          System.out.println(fileP);
          rd.read(fileP);
    
       }catch(Exception ex) {
           System.out.println(ex);
       }
       }
       public void doGet(HttpServletRequest request, 
                           HttpServletResponse response)
            throws ServletException, java.io.IOException {
    
            throw new ServletException("GET method used with " +
                    getClass( ).getName( )+": POST method required.");
       } 
    }
    

    This is the class for reading the excel sheet using apache poi jars:

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.Iterator;
    
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    public class ReadExcelDemo { 
        public static void read(String filePath)  {
    //  public static void main(String[] args){
     try {           
         FileInputStream file = new FileInputStream(new File(filePath));  
    //   FileInputStream file = new FileInputStream(new File("C:\\work\\demo.xlsx"));
        //Create Workbook instance holding reference to .xlsx file  
        XSSFWorkbook workbook = new XSSFWorkbook(file); 
        //Get first/desired sheet from the workbook
        XSSFSheet sheet = workbook.getSheetAt(0);
        //Iterate through each rows one by one  
        Iterator<Row> rowIterator = sheet.iterator();   
        while (rowIterator.hasNext()) {            
            Row row = rowIterator.next();
            //For each row, iterate through all the columns  
            Iterator<Cell> cellIterator = row.cellIterator();   
            while (cellIterator.hasNext())  {               
                Cell cell = cellIterator.next();    
                //Check the cell type and format accordingly   
                switch (cell.getCellType())                     {        
                    case Cell.CELL_TYPE_NUMERIC:  System.out.print(cell.getNumericCellValue() + "\t"); 
                break;                       
                    case Cell.CELL_TYPE_STRING: System.out.print(cell.getStringCellValue() + "\t");  
                break;     
                }           
            }             
            System.out.println("");         
        }  
    /*  int row=0;
        int k=1;
        Row myRow = sheet.createRow ((short)row);
         myRow.createCell(k).setCellValue ("new data"); 
          myRow = sheet.createRow ((short)row++); */
    //  Cell cell1 = sheet.   // Access the second cell in second row to update the value
    
      //  cell1.setCellValue("OverRide Last Name");
    
         Cell cell1 = null; // declare a Cell object
    
         cell1 = sheet.getRow(2).getCell(2);   // Access the second cell in second row to update the value
    
         cell1.setCellValue("OverRide Last Name");
    
    
        file.close();
    /*  FileOutputStream out = new FileOutputStream(new File("write_demo1.xlsx"));
        workbook.write(out);  
        out.close(); */
        }
        catch (Exception e) {      
            e.printStackTrace();   
            }
        }
     }