Как получить файл Excel из запроса? - PullRequest
1 голос
/ 14 марта 2012

Я загружаю файл Excel с одной страницы JSP. ниже код.

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

Но как получить файл Excel на следующей странице (Upload.jsp)? Я использовал, но получаю ошибку во второй строке.

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

Тогда как получить файл Excel из запроса?

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

Вы получаете Multipart / form-data по запросу, из которого вам нужно извлечь Часть, содержащую ваши байты файла.

Для этого проще всего использовать Apache Commons Fileupload

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

0 голосов
/ 15 марта 2012

Ну, ребята, спасибо за ответ.Но я решил проблему с процессом ниже.

Внутри 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>

Создан компонент формы: внутри него

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

В классе загрузки действия:

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

Теперь работает нормально.

0 голосов
/ 14 марта 2012

Создать FileUploader

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

import org.apache.commons.fileupload.servlet. ; импорт java.io. ;

открытый класс FileUploader { приватный статический загрузчик ServletFileUpload;

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;

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

}

...