zoukankan      html  css  js  c++  java
  • struts2实现文件上传、多文件上传和文件下载

    总结的两个问题,就是struts2上传下载的时候对属性名配置要求非常严格:

    第一:上传的时候

        private File file;

        private String fileContentType;

    private String fileFileName;

    属性的红色部分必须有可以随意起,但不能省略。

    第二:下载的时候属性名不能随意起。

     

     

    实现文件上传:可以找到WEB-INFlibstruts2-core-2.3.16.3.jar下的struts-default.xml里的拦截器标签下的name=fileUpload的实体类alt+shift+t进去源代码(前提是关联好jar),看看

     

    我的上传Action:

    package cn.jbit.action;

     

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.FileOutputStream;

    import java.io.InputStream;

    import java.io.OutputStream;

     

    import org.apache.struts2.ServletActionContext;

     

    import com.opensymphony.xwork2.ActionSupport;

     

    public class UploadAction extends ActionSupport {

    //Action中使用了3个属性来封装文件信息

    //1:File类型的xxx属性:与表单中的File控件的name属性一致,用于封装File控件对应的文件内容

    //2:String类型的xxxFileName属性和3:String类型的xxxContentType属性,这两个属性的固定语法是

    //File类型的属性名+后缀FileName|ContentType组合成最终:xxxFileName,xxxContentType

    //如果不按固定语法写的话,可能会造成文件名和文件类型读取不到的情况,最终写入的文件是一个

    //名字为:null,并且没有类型格式的文件信息。(虽然手动改成.jpg也会显示) private File file;

        private String fileContentType;

        private String fileFileName;

    @Override

    public String execute() throws Exception {

    //1024*1024=1M

      byte[] buffer=new byte[1024*1024];

      //表单里的file标签

      InputStream fis=new FileInputStream(file);

      //WebRoot目录下创建一个存放图片的文件夹,然后获取真实的地址

      String path=ServletActionContext.getServletContext().getRealPath("image");

      path=path+"\"+this.fileFileName;

      System.out.println(path);

      //最终把读到的二进制流都写入,真实地址下同名的文件里

      OutputStream os=new FileOutputStream(path);

      //OutputStream os=new FileOutputStream("E:\upload\"+this.fileFileName);

      int len=0;

      while((len=fis.read(buffer))>0){

      os.write(buffer,0,len);

      }

      fis.close();

      os.close();

    return SUCCESS;

    }

    public File getFile() {

    return file;

    }

    public void setFile(File file) {

    this.file = file;

    }

    public String getFileContentType() {

    return fileContentType;

    }

    public void setFileContentType(String fileContentType) {

    this.fileContentType = fileContentType;

    }

    public String getFileFileName() {

    return fileFileName;

    }

    public void setFileFileName(String fileFileName) {

    this.fileFileName = fileFileName;

    }

    上传完之后,切记就是此时如果你在WebRoot下右键打开imageMyEclipseopen in Explorer是找不到你上传的图片的,因为图片真实的存储地址是在项目部署的地方webapps里如:E:Program Files (x86)apache-tomcat-7.0.55webappsupimage而不是这个路径:E:java2upload2014122WebRootimage

     

    上传文件的表单:

     <body>

          <s:form action="upload" enctype="multipart/form-data" method="post">

          <s:file name="file" label="选择文件"></s:file>

          <s:submit value="上传"></s:submit>

          </s:form>

      </body>

    成功后跳转的页面:

          您所上传的文件是:<s:property value="fileFileName"/><br/>

          文件类型:<s:property value="fileContentType"/><br/>。

    上传多个文件的话:

    我们在WEB-INFlibstruts2-core-2.3.16.3.jar下的org.apache.struts2下的default.properties里搜索max能看到:

    struts.multipart.maxSize=2097152

    也就是struts2里给的默认上传大小是2M(上传多个文件总大小),那么我们可以在struts2.xml里面设置大点:

     //20M

     <constant name="struts.multipart.maxSize" value="20971520"/>

    我的上传表单为:

          <s:form action="upload" enctype="multipart/form-data" method="post">

          <s:file name="files" label="选择文件"></s:file>

          <s:file name="files" label="选择文件"></s:file>

          <s:file name="files" label="选择文件"></s:file>

          <s:file name="files" label="选择文件"></s:file>

          <s:file name="files" label="选择文件"></s:file>

          <s:file name="files" label="选择文件"></s:file>

          <s:submit value="上传"></s:submit>

    我的上传Action:

    package cn.jbit.action;

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.FileOutputStream;

    import java.io.InputStream;

    import java.io.OutputStream;

    import org.apache.struts2.ServletActionContext;

    import com.opensymphony.xwork2.ActionSupport;

    public class UploadAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

        private File[] files;

        private String[] filesContentType;

        private String[] filesFileName;

    @Override

    public String execute() throws Exception {

    byte[] buffer=new byte[1024*1024];

    files=getFiles();

    for (int i = 0; i < files.length; i++) {

      //表单里的file标签

      InputStream fis=new FileInputStream(files[i]);

      //WebRoot目录下创建一个存放图片的文件夹,然后获取真实的地址

      String path=ServletActionContext.getServletContext().getRealPath("image");

      path=path+"\"+this.filesFileName[i];

      System.out.println(path);

      //最终把读到的二进制流都写入,真实地址下同名的文件里

                  OutputStream os=new FileOutputStream(path);

      int len=0;

      while((len=fis.read(buffer))>0){

      os.write(buffer,0,len);

      }

      fis.close();

      os.close();

    }

     

    return SUCCESS;

    }

     

    public File[] getFiles() {

    return files;

    }

    public void setFiles(File[] files) {

    this.files = files;

    }

    public String[] getFilesContentType() {

    return filesContentType;

    }

     

     

       public void setFilesContentType(String[] filesContentType) {

    this.filesContentType = filesContentType;

    }

    public String[] getFilesFileName() {

    return filesFileName;

    }

    public void setFilesFileName(String[] filesFileName) {

    this.filesFileName = filesFileName;

    }

    }

    实现文件下载:

    我的Action:

    package cn.jbit.action;

     

    import java.io.BufferedInputStream;

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.InputStream;

     

    import org.apache.struts2.ServletActionContext;

     

    import com.opensymphony.xwork2.ActionSupport;

     

    public class FileDownAction extends ActionSupport {

    //struts2对属性名的配置很严格,如果不正确是会报错的,我在这里犯了个错

       //private InputStream InputStream ;声明成了InputStream input;

       //就给我报错说找不到inputStream,所以建议 //fileName,contentType,inputStream属性名不要自己随便起名。

     

     

    对常用的属性名来说比如

    //读取下载文件的目录

    private String path;

    //下载文件的文件名

    private String fileName;

    //下载文件的类型

    private String contentType;

    //读取下载文件的输入流

    private InputStream inputStream;

     

     

     

     

    @Override

    public String execute() throws Exception {

    return SUCCESS;

    }

    public String getFileName() {

    return fileName;

    }

    public void setFileName(String fileName) {

    this.fileName = fileName;

    }

    public String getContentType() {

    return contentType;

    }

    public void setContentType(String contentType) {

    this.contentType = contentType;

    }

    public InputStream getInputStream() throws FileNotFoundException {

    String paths=ServletActionContext.getServletContext().getRealPath(path);

    return new BufferedInputStream(new FileInputStream(paths+"\"+fileName));

    }

    public void setInputStream(InputStream inputStream) {

    this.inputStream = inputStream;

    }

    public String getPath() {

    return path;

    }

    public void setPath(String path) {

    this.path = path;

    }

    }

    我的struts.xml配置:

    <action name="download" class="cn.jbit.action.FileDownAction" >

                <param name="path">/image</param>

                <result name="success" type="stream"> 

                   <!-- 找到发布服务器Tomcat下→conf→web.xml里有各种各样的mime类型 -->

                   <!-- mime:多用途互联网邮件扩展类型,是设定某种扩展名的文件用一种应用程序来打开的方式类型 -->

                   <param name="contentType">image/jpeg</param>

                   <param name="fileName">input</param>

                   <param name="contentDisposition">

                    <!-- contentDisposition参数由两部分组成,前面的部分标识处理文件的形式,如attachment表示在下载时弹出对话框,提示用户保存或者直接打开该文件;

                       后一部分标识下载文件的文件名称,量部分之间以分号进行分割 -->                         

                        attachment;filename="${fileName}"

                   </param>

                   <!-- 设置 下载时缓存区的大小,由于是从服务器里下载,建议不要设置太大 -->

                   <param name="bufferSize">4096</param>

                 </result>

            </action>

     

    我的down.jsp:

     <a href="download.action?fileName=Hydrangeas.jpg">点击此处下载文档</a>

     

  • 相关阅读:
    python 元类
    python中__init__()、__new__()、__call__()、__del__()用法
    python内置数据结构方法的时间复杂度
    时间复杂度和空间复杂度
    数据结构及算法(1)
    sys模块python
    python中的文本操作
    python 中的os模块
    python 几种不同的格式化输出
    【js】null 和 undefined的区别?
  • 原文地址:https://www.cnblogs.com/345214483-qq/p/4139693.html
Copyright © 2011-2022 走看看