2012-03-14 62 views
1

我从一个jsp页面上传一个excel文件。下面是代码。如何从请求中获取excel文件?

<form action="Upload.jsp" enctype="MULTIPART/FORM-DATA" method=post > 
     <input type="file" name="filename" /> 
     <input type="submit" value="Upload" /> 
    </form> 

但是如何获取下一页(Upload.jsp)中的excel文件? 我正在使用,但在第二行出现错误。

InputStream file = request.getInputStream(); 
POIFSFileSystem myFileSystem = new POIFSFileSystem(file); 

那么如何从请求Excel文件?

+0

请注意,OP使用的是Struts,但在问题中根本没有提及它。 – BalusC 2012-03-15 12:00:03

回答

2

您正在从请求中获取Multipart/form-data,您需要从中提取包含文件字节的部分。

要做到这一点最简单的就是使用Apache通用FileUpload

http://commons.apache.org/fileupload/

0

创建FileUploader

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

进口org.apache.commons.fileupload.servlet。 ; import java.io.;

public class FileUploader private static ServletFileUpload uploader;

private FileUploader() 
{ 

} 

public static synchronized ServletFileUpload getservletFileUploader(String tempDir, int maxSizeInMB) 
{ 
    if(uploader == null) 
    { 
     DiskFileItemFactory factory = new DiskFileItemFactory(); 

     factory.setSizeThreshold(1024 * 1024); 
     factory.setRepository(new File(tempDir)); 

     uploader = new ServletFileUpload(factory); 

     uploader.setFileSizeMax(maxSizeInMB * 1024 * 1024); 
    } 

    return uploader; 
} 

}

处理请求

protected MultiPartFormData handleMultiPartRequest(HttpServletRequest request) 
throws FileSizeLimitExceededException 
{ 
    if(!isMultipartRequest(request)) 
     return null; 

    ServletFileUpload upload = FileUploader.getservletFileUploader(tempDir, 50); 
    MultiPartFormData data = new MultiPartFormData(); 
    try 
    { 
     List<FileItem> items = upload.parseRequest(request); 

     for (FileItem item : items) 
     { 
      if(item.isFormField()) 
      { 
       data.getParameters().put(item.getFieldName(), item.getString()); 
      } 
      else 
      { 
       String filename = item.getName(); 

       //Internet explorer and firefox will send the file name differently 
       //Internet explorer will send the entire path to the file name including 
       //the backslash characters etc ... we should strip it down 
       //THIS IS HACKY 
       if(filename.indexOf("\\") != -1) 
       { 
        int index = filename.lastIndexOf("\\"); 
        filename = filename.substring(index + 1); 
       } 


       if(filename == null || filename.equals("")) 
       { 
        //do nothing 
       } 
       else 
       { 
        String randomFileName = (new RandomGUID()).toString() + getFileExtension(filename); 


        File uploadFile = new File(uploadDir + File.separator + randomFileName); 
        item.write(uploadFile); 

       } 
      } 
     } 
    } 
    catch(FileSizeLimitExceededException e) 
    { 
     throw e; 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 

    } 


    return data; 
} 

时供您参考。然后使用它... MultiPartForm数据看起来像

import java.util.Hashtable; 

进口的java.util.ArrayList;

公共类MultiPartFormData {

private ArrayList<Integer> fids; 
private Hashtable<String, String> parameters; 


public MultiPartFormData() 
{ 
    this.fids = new ArrayList<Integer>(); 
    this.parameters = new Hashtable<String, String>(); 
} 

public ArrayList<Integer> getFids() { 
    return fids; 
} 
public void setFids(ArrayList<Integer> fids) { 
    this.fids = fids; 
} 
public Hashtable<String, String> getParameters() { 
    return parameters; 
} 
public void setParameters(Hashtable<String, String> parameters) { 
    this.parameters = parameters; 
} 

}

+0

至于文件名部分,请阅读[FileUpload指南](http://commons.apache.org/fileupload/faq.html#whole-path-from-IE)以获得更简单的方法。 – BalusC 2012-03-15 11:57:02

0

好球员,感谢所有的答复。但我已经通过以下流程解决了这个问题。

内部JSP:

<form action="/upload.do" enctype="MULTIPART/FORM-DATA" method=post > 
     <input type="file" name="file" id="file" size=25/> 
     <input type="submit" value="Upload" /> 
    </form> 

创建表单bean:

FileUploadForm uploadForm = (FileUploadForm) form; 
FormFile file = uploadForm.getFile(); 
InputStream stream = file.getInputStream(); 
POIFSFileSystem fsFileSystem = new POIFSFileSystem(stream); 
// 
    rest of code for reading the excel 
// 

现在,它的工作的罚款:即

private FormFile file; 
    public void setFile(FormFile file) { 
     this.file = file; 
    } 
    public FormFile getFile() { 
     return file; 
    } 

在动作类上传里面。

+0

你应该从一开始就提到你正在使用MVC框架Struts。 – BalusC 2012-03-15 11:57:46