java之struts2之文件上传


1.在大多数应用中,都有文件上传功能。有两种文件上传的方式,一种是自己去解析http协议,获取文件上传的内容。另一种是通过第三方插件来实现文件上传。第三方插件一般有两种,smartfileupload(上传小文件效率比较好,没有更新),commons-fileupload

2.在servlet中实现文件上传的步骤

  a) 导入jar包 commons-fileupload, common-io

  b) 编写jsp 页面,表单提交必须是 post ,enctype="multipart/form-data"


    
fileupload" method="post" enctype="multipart/form-data"> 用户名:
文件:

  c) 编写servlet 

@WebServlet("/fileupload")
public class FileUploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //上传文件存放位置
        String path = req.getServletContext().getRealPath("/upload");
        //创建磁盘目录工厂  该工厂可以设置 临时文件大小,还可以设置临时目录
        DiskFileItemFactory df = new DiskFileItemFactory();
        //将目录绑定ServletFileUpload 类  这个类完成http协议的解析
        ServletFileUpload upload=new ServletFileUpload(df);
        try {
            //解析req  返回所有表单项目目录
            List list = upload.parseRequest(req);
            for(FileItem item:list){
                if(item.isFormField()){//正常表单项
                    String name=item.getFieldName();
                    String value=item.getString();
                    System.out.println(name+"======"+value);
                }else{//文件上传项
                    String name=item.getName();
                    InputStream is = item.getInputStream();
                    OutputStream os = new FileOutputStream(new File(path,name));
                    byte[] buffer = new byte[400];
                    int len=0;
                    while((len=is.read(buffer))!=-1)
                        os.write(buffer, 0, len);
                    os.close();
                    is.close();
                }
            }
            
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }
}

3. Struts2中已经将文件上传功能封装好了,不需要再像servlet一样,分别来自己编码实现。

实现步骤

  a) 编写 jsp 页面和 servlet 编写方式一样

文件:

  b) 编写处理上传文件的 Action

public class UploadAction {
    //File的名称和表单域中的名称相同
    private File file;
    //获取文件名  文件名属性 必须是  表单域名+FileName;
    private String fileFileName;
    //获取文件的类型
    private String fileContentType;
    //上传的处理方法
    public String upload(){
        String path=ServletActionContext.getServletContext().getRealPath("/upload");
        try {
            FileUtils.copyFile(file, new File(path,fileFileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Action.SUCCESS;
    }
    
    public File getFile() {
        return file;
    }
    public void setFile(File file) {
        this.file = file;
    }
    public String getFileFileName() {
        return fileFileName;
    }
    public void setFileFileName(String fileFileName) {
        this.fileFileName = fileFileName;
    }
    public String getFileContentType() {
        return fileContentType;
    }
    public void setFileContentType(String fileContentType) {
        this.fileContentType = fileContentType;
    }
}

4.批量的文件上传实现

Action 的实现

public class BatchUploadAction {
    //File的名称和表单域中的名称相同
    private File[] file;
    //获取文件名  文件名属性 必须是  表单域名+FileName;
    private String[] fileFileName;
    //获取文件的类型
    private String[] fileContentType;
    //上传的处理方法
    public String upload(){
        String path=ServletActionContext.getServletContext().getRealPath("/upload");
        try {
            for(int i=0;i)
                FileUtils.copyFile(file[i], new File(path,fileFileName[i]));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Action.SUCCESS;
    }
    public File[] getFile() {
        return file;
    }
    public void setFile(File[] file) {
        this.file = file;
    }
    public String[] getFileFileName() {
        return fileFileName;
    }
    public void setFileFileName(String[] fileFileName) {
        this.fileFileName = fileFileName;
    }
    public String[] getFileContentType() {
        return fileContentType;
    }
    public void setFileContentType(String[] fileContentType) {
        this.fileContentType = fileContentType;
    }
}

Jsp





    
文件:btn"/>

Struts.xml


    
    
    <package name="default" extends="struts-default" namespace="/">
        class="cn.sxt.action.UploadAction" method="upload">
            /success.jsp
        
        class="cn.sxt.action.BatchUploadAction" method="upload">
            /success.jsp
            
                
                20971520
            
            
        
    package>

相关