struts2 实现简单的文件上传、下载功能

一、使用 commons-fileupload.jar 实现文件上传

1.1 commons-fileupload.jar 简介

Commons FileUpload 是 Apache Commons 下的一个子项目,commons-fileupload 包能够让你的 servlet 和 web 应用能够很方便的实现健壮的、高性能的文件上传功能。

FileUpload 可以解析 HTTP 请求。如果一个 HTTP 请求使用 POST 方式提交,且该请求的内容类型标识为 “multipart/form-data” ,那么 FileUpload 就可以解析这个请求,并且使得到的结果更容易被程序所使用。

发送 “multipart/form-data” 请求的最简单的方法是通过页面表单提交请求。

<!-- 注:页面文件上传表单, method 属性必须为 "post",且编码类型 enctype 属性必须是 "multipart/form-data",任何语言都需要满足这两点。-->
<form  action="fileUpload.action" method="post" enctype="multipart/form-data">
    file: <input type="file" name="file"> <br>
    username: <input type="text" name="username"><br>
    <input type="submit" value="sumit">  
</form>

1.2 在 servlet 类中使用Commons-fileupload 实现简单的文件上传

public class UploadServlet extends HttpServlet{

    private static final long serialVersionUID = 1L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        DiskFileItemFactory factory = new DiskFileItemFactory();
        String path = req.getRealPath("/fileUp");
        //指定大文件的临时存放目录
        factory.setRepository(new File(path));
        //设置大文件的最小大小,默认为10K,设置单位为字节,现在设置的大小为1G
        factory.setSizeThreshold(1024*1024);

        ServletFileUpload upload = new ServletFileUpload(factory);

        try{
            //list 集合里不但存放了上传的文件信息,还存放表单的其他类型请求的信息
            List<FileItem> list = upload.parseRequest(req);

            for(FileItem item:list){
                String name = item.getFieldName();
                //判断是否为普通的表单内容
                if(item.isFormField()){
                    String value = item.getString();
                    System.out.println(name+"="+value);
                    req.setAttribute(name, value);
                }else{
                    //获取文件名,有些浏览器会包括路径,如opera浏览器
                    String value = item.getName();
                    //如果忽略opera浏览器则不需要删除路径的操作
                    int start = value.lastIndexOf("\\");
                    String fileName = value.substring(start+1);

                    req.setAttribute(name, fileName);
                    //item.write完成上传文件写入服务器指定目录的工作,且会自动删除临时文件
//                  item.write(new File(path,fileName));

                    //如果需要自己实现写入硬盘的操作,需要删除临时文件
                    OutputStream os = new FileOutputStream(new File(path,fileName));
                    InputStream is = item.getInputStream();

                    byte[] buffer = new byte[400];
                    int length = 0;
                    while((length = is.read(buffer))!= -1){
                        os.write(buffer, 0,length);
                    }
                    is.close();
                    os.close();
                }

            }
        }catch(Exception e){
            e.printStackTrace();
        }
        //将请求转发给fileUploadResult.jsp结果页面
        req.getRequestDispatcher("/fileUp/fileUploadResult.jsp").forward(req, resp);;
    }
}

二 使用 struts2 实现文件上传功能

struts2 没有自己的文件上传实现,它仅仅是封装了common-fileupload 等第三方的文件上传的工具。

struts2 中在 default.properties 文件中设置了默认的最大上传文件大小为2M:
struts.multipart.maxSize=2097152(单位:byte,字节)
可在程序中创建struts.properties,或者在 struts.xml 中重新制定该属性的大小:

#在struts.properties中设置最大文件上传大小为1G
struts.multipart.maxSize=1073741824

<!-- 在struts.xml中设置最大文件上传大小为1G -->
<constant name="struts.multipart.maxSize" value="1073741824"></constant>

struts2 实现文件上传功能的示例:

public class UploadAction extends ActionSupport {


    private String username;
    //struts2会自动将上传的文件转换为File对象,使用file.getName()会获得临时文件的文件名
    private File file;
    //获得上传文件的文件名,不能用file.getName获得。
    //且其命名规则中file为上传文件的表单的name属性值,加"FileName";
    private String fileFileName;
    //获得上传文件的类型
    //命名规则:上传文件的表单的name属性值,加"FileName"
    private String fileContentType;

    //对于多文件上传可设置List类型属性或多个满足命名规则的不同属性:
    //private List<File> file;
    //private List<String> fileFileName;
    //private List<String> fileContentType;
    @Override
    public String execute() throws Exception {
        String root = ServletActionContext.getRequest().getRealPath("/fileUp");
        System.out.println(root);
        InputStream is = new FileInputStream(file);
        System.out.println("fileFileName: "+fileFileName);
        File destFile = new File(root,fileFileName);

        OutputStream os = new FileOutputStream(destFile);

        byte[] buffer = new byte[400];
        int length = 0;
        while(-1 != (length = is.read(buffer))){
            os.write(buffer,0,length);
        }
        is.close();
        os.close();

        return SUCCESS;

    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    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;
    }
}

三、struts2 实现下载功能

struts2 实现下载实例一:

// DownloadAction.java
public class DownloadAction extends ActionSupport {

    // 用于动态生成下载的文件名
    private String filename;

    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

    //主要的执行方法
    public InputStream getDownloadFile(){
        //如果输入的是中文名文件,不做处理在页面上显示会出现乱码的情况
        //需要做如下处理:this.filename = new String("中文.txt".getBytes("gbk"),"8859_1");gbk为操作系统默认编码,8859_1是http协议要求编码
        //参考资料:http://jiapumin.iteye.com/blog/1006144
        this.filename = "haha.txt";
        return ServletActionContext.getServletContext().getResourceAsStream("/download/xxx.txt");
    }

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
}

<!-- struts.xml -->
    <package name="struts2" extends="struts-default" namespace="/">
        <action name="downloadFile" class="com.struts2.download.DownloadAction">
            <!-- "contentDisposition" 属性为http协议的一个属性
                "attachment;"不加的话默认为 inline ,当下载的文件,浏览器判定可以打开时会自动打开,不会跳出下载框 
                filename="xxx" 的值会决定浏览器下载时文件的文件名
                filename=${filename} 动态生成下载文件显示的文件名
                inputName的值会使程序执行action中的get+属性值的方法,示例中即为 getDownloadFile 方法。
            -->

            <result type="stream">
                <param name="contentDisposition">attachment;filename=${filename}</param>
                <param name="inputName">downloadFile</param>
            </result>
        </action>
    </package>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值