2015-06-28 9 views
5

Ich weiß, wie eine Datei laden:lesen Sie den Inhalt einer Datei-Upload in Java

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

Dies ist die Klasse, die Datei zum Lesen:

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

    } 
} 

Nun, wie verknüpfen Sie diese beiden zusammen. Der Benutzer lädt die Datei auf den Server und der Server verarbeitet sie. d. h. es akzeptiert die Datei und druckt sie aus. Kann ich das Struts-Framework dafür verwenden? Ich möchte Excel-Blatt hochladen und den Inhalt auf die JSP-Seite drucken. Ich habe den Code zum Lesen der Excel-Tabelle in Java mit Apache Poi. Aber der Pfad zum Lesen der Excel-Datei ist fest codiert. Wie nimmst du es aus der hochgeladenen Datei?

Dies ist die Datei für Excel-Blatt zu lesen:

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

Ausgang:

ID Name ZUNAME 1.0 Amit Shukla 2.0 Lokesh Gupta
3.0 John Adwards 4.0 Brian Schultz

Aber wie steckst du die hochgeladene und die Servlet-Datei zusammen. Wie liest du die hochgeladene Datei?

+0

Sie müssen ein Servlet schreiben, das die Datei empfängt. Dieses Servlet kann dann die Poi-Verarbeitung und das Rendern durchführen. – Marged

Antwort

0

Ich habe es. Die Indexdatei (HTML) ist die Datei für das Hochladen (wie oben in meinem qquestion) Die Java-Klasse für sie ist:

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

Dies ist die Klasse, die Excel-Tabelle für das Lesen von Apache poi Gläser mit:

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(); 
     } 
    } 
} 
+0

kann mir jemand sagen, wie Sie die Verarbeitung im laufenden Betrieb machen. Hier speichere ich die hochgeladene Datei auf dem Server, aber ich möchte im Speicher verarbeiten. Sollte ich jede Zeile des Excel in einer Datenstruktur wie Liste speichern? Außerdem muss ich jeden Excel-Zeilenwert mit Datenbankwerten für Validierungen vergleichen. – coder

2

Wie bei vielen Java-Operationen ist das Lesen eines Datei-Uploads unnötig komplex und aus den Javadocs schwierig zu erstellen. Sie planen bereits, Apache-Bibliotheken zu verwenden, um Ihre hochgeladene Datei zu lesen. Daher empfehle ich, apache.commons.fileupload zum Hochladen Ihrer Datei zu verwenden.

Dieses Codefragment uploads eine CSV in einen String-Datei:

... 

import org.apache.commons.fileupload.*; 
import org.apache.commons.fileupload.disk.*; 
import org.apache.commons.fileupload.servlet.*; 

... 

    if (ServletFileUpload.isMultipartContent(request)) { 
    int i=0; 

    DiskFileItemFactory factory = new DiskFileItemFactory(); 
    // files smaller than 5MB will be held in memory 
    factory.setSizeThreshold(5000000); 

    ServletFileUpload upload = new ServletFileUpload(factory); 
    upload.setFileSizeMax(10000000); // max size of attachment 10MB 

    List list = upload.parseRequest(request); 
    Iterator iter = list.iterator(); 

    String csv = null; 

    while (iter.hasNext()) {    
     FileItem param = (FileItem)iter.next(); 
     if (!param.isFormField()) { 
     csv = param.getString(); 
     break; 
     } 
    } 

    if (csv==null) { 
     throw new Exception("CSV buffer not uploaded"); 
    } 
    } 
+0

Sucht das OP nach einer Lösung zum Senden oder Empfangen? Ich denke, er braucht den Code für den Empfänger. – Marged

2

Sie es durch das Brechen gesamten Prozess in zwei Schritten erreicht werden kann

1) Hochladen einer Datei

boolean isMultipart = ServletFileUpload.isMultipartContent(request); 

     if (!isMultipart) { 
      return; 
     } 

     // Create a factory for disk-based file items 
     DiskFileItemFactory factory = new DiskFileItemFactory(); 

     // Sets the size threshold beyond which files are written directly to 
     // disk. 
     factory.setSizeThreshold(MAX_MEMORY_SIZE); 

     // Sets the directory used to temporarily store files that are larger 
     // than the configured size threshold. We use temporary directory for 
     // java 
     factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); 

     // constructs the folder where uploaded file will be stored 
     String uploadFolder = getServletContext().getRealPath("") 
       + File.separator + DATA_DIRECTORY; 

     // Create a new file upload handler 
     ServletFileUpload upload = new ServletFileUpload(factory); 

     // Set overall request size constraint 
     upload.setSizeMax(MAX_REQUEST_SIZE); 

     try { 
      // Parse the request 
      List items = upload.parseRequest(request); 
      Iterator iter = items.iterator(); 
      while (iter.hasNext()) { 
       FileItem item = (FileItem) iter.next(); 

       if (!item.isFormField()) { 
        String fileName = new File(item.getName()).getName(); 
        String filePath = uploadFolder + File.separator + fileName; 
        File uploadedFile = new File(filePath); 
        System.out.println(filePath); 
        // saves the file to upload directory 
        item.write(uploadedFile); 
       } 
      } 

      // displays done.jsp page after upload finished 
      getServletContext().getRequestDispatcher("/done.jsp").forward(
        request, response); 

     } catch (FileUploadException ex) { 
      throw new ServletException(ex); 
     } catch (Exception ex) { 
      throw new ServletException(ex); 
     } 

2) Nach dem Upload übergeben Sie den Speicherort der Datei an die Methode, die Dateidaten mit Hilfe von apche poi lesen. Verwenden Sie das Objekt File uploadedFile = new File(filePath);, um den Speicherort der Datei abzurufen.

Verwandte Themen