Struts2框架11.文件上传与下载

来源:互联网 发布:硕思logo设计软件 编辑:程序博客网 时间:2024/06/06 18:53
  在Struts2中也是使用commons-fileupload.jar架包来实现文件上传,只不过Struts2框架给我们封装好了一部分代码,我们只需要要做就是文件保存。在Strur2框架中是使用fileUpload拦截器实现的,此拦截器在defaultStack拦截器栈中有引用。当然上传文件可以是单个文件上传也可以是多个文件上传,多个文件是将Action的属性声明成数组。
 
 下面我们创建一个.jsp文件
<form action="./uploadUploadAction" method="post" enctype="multipart/form-data">        选择文件<input type="file" name="uploadFile"/>        <input type="submit" value="提交"></form>

注:文件上传method属性必须为post,enctype属性为multipart/form-data。
  <input/>元素的type属性为file,表明是文件域

 下面我们创建一个UploadAction类

public class UploadAction extends ActionSupport {    private File uploadFile;    private String uploadFileFileName;    private String uploadFileContentType;    //文件上传    public String upload(){        return Action.SUCCESS;    }}
 注意:
  1.上面代码中为了简洁,我删掉了属性的set和get方法,大家需要生成。
  2.UploadAaction类中的这三个属性可不是随便定义的,是要遵循规定。
属性详解
  uploadFile属性:要与jsp页面中文件域的name属性相同。作用是用于封装File控件对应文件的内容,简单的说就是封装你选择的文件。
  uploadFileFileName属性:该属性名是由File类型属性名和FileName组成。作用是封装File控件对应的属性名。
  uploadFileContentType属性:该属性名是由File类型属性名和ContentType组成。作用是封装File控件对应的文件类型。

也就是说除了File类型的属性外,其它两种属性名都是固定写法。再举例说明一下:
我们将jsp页面的File空间的name属性设置为xxx,<input type="file" name="xxx"/>,那么我们的Action类中的属性要写成如下
File xxx;String xxxFileName; String xxxContentType;


 做好上面的准备之后我们就需要在upload()方法中写代码,实现文件保存。
public String upload(){        FileInputStream fis = null; //文件输入流        FileOutputStream fos = null;//文件输出流        ServletContext context = ServletActionContext.getServletContext();        try {            //将要上传的File对象放入,文件输入流,方便从文件输入流读取字节,写到硬盘            fis = new FileInputStream(uploadFile);            //使用文件输出流写到硬盘时要注意,文件路径必须是物理路径如"c:\test\xxx.xx",也就是说必须有盘符和文件名            //getRealPath()方法是将虚拟路径转换成真实路径,加上文件名,拼接成真实的物理路径就可以使用这个路径写出文件了。            String realPath = context.getRealPath(savePath) + "\\" + uploadFileFileName;            //将真实物理地址放到FileOutputStream的构造函数中创建文件输出流对象            fos = new FileOutputStream(realPath);            int date;            <span style="font-family: SimSun;">//这里就是每次循环读取一个字节,这个date中存储的就是你读取的字节,读到文件最后会返回-1</span><pre name="code" class="java" style="font-size: 14px;">            <span style="font-family: SimSun;">//这里也可以将read方法中传入一个</span><span style="font-family: SimSun;">byte</span><span style="font-family: SimSun;">类型数组</span><span style="font-family: SimSun;">byte[] bytes = new byte[1024]</span><span style="font-family: SimSun;">,1024是大小</span><span style="font-family: SimSun;"></span><pre name="code" class="java" style="font-size: 14px;">            <span style="font-family: SimSun;">//这个时候date存入的不是读取的字节,而是你读入的字节大小,例如读到文件最后,只读了300字节那么date就为300.</span><pre name="code" class="java" style="font-size: 14px;">            <span style="font-family: SimSun;">//使用指定字节来读取数据就需要使用fos.write(bytes, 0, date);</span>

while ((date = fis.read()) != -1){ fos.write(date); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { fis.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } return Action.SUCCESS;}
  这里也可以使用
  注意:上面用到了一个String类型的savePath属性,这个属性的值是上传的文件保存在服务器的那个目录中。例如我要将上传的文件保存在\page\uploadFile\upload路基下,那么你的savePath="\\page\\uploadFile\\upload";这种方法是在程序中写死的,如果你想换路径那么就要修改程序源码然后在重新编译程序。我使用的方法是在struts.xml文件中配置,这样当我要修改的时候,就可以修改struts.xml文件就行了。
<param name="svsePath">/page/uploadFile/upload</param>
只需要在你的action元素中配置以上代码就可以实现,其中name属性为你Action类中的变量名,元素中间的数据为要保存到的路径。这种方法也可以做一些初始化工作,例如初始值。

下面介绍几个属性
struts.multipart.saveDir:临时文件目录
配置上传文件大小
<constant name="struts.multipart.maxSize" value=""/>
<interceptor-ref name="fileUpload">
     <param name="maximumSize"></param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
注意:struts.multipart.maxSize属性的值必须大于或等于maximumSize的值


================== 文件下载 ==================
这里主要实现收费下载这个功能
<action name="DownloadAction" class="com.house.action.DownloadAction" method="download"><result name="success" type="stream"><param name="contentType">application/msword</param><param name="inputStream">inputStream</param>/download_success.jsp</result></action>
配置action
DownloadAction类中声明两个属性
  private InputStream inputStream;
  private String res="/source/test.doc";
public InputStream getInputStream() throws FileNotFoundException {ServletContext context=ServletActionContext.getServletContext();InputStream inputStream=new FileInputStream(context.getRealPath(res));return inputStream;}
将生成的get方法写成这个样子就行了

0 0