SSH框架下使用Commons FileUpload控件完成多文件上传与下载

    某些系统中,经常需要用到上传与下载功能,其中,如果指定了不同角色上传多不同文件,并且指定给其他角色进行下载。那么一般最好的方法就是将文件按照不同路径上传到不同的文件夹中,然后再在数据库中存入文件路径。

    比如在教务系统中,学生要求上传自己的作业,然后给教师进行下载。其中不同的学生上传不同的作业文件,然后老师按照需要下载某个学生的作业文件。如上,如果直接将文件上传到某个文件夹之后,就必须在action或者jsp链接中指定老师需要下载的某个学生作业文件,这样就显得麻烦而且很难实现。

    有两种思路,一种是将文件转换为二进制,然后存入到数据库中,这种方法有个问题,就是如果上传的文件较大超过了限制的大小,那么就无法上传到数据库。

    第二种是在项目下或者服务器中新建一个文件夹,将学生上传的文件上传到这个文件夹中,然后在action中获取该文件的路径以及文件名称,然后将文件路径和文件名称一起存到数据库中,因为存入的只是一个String字符串,所以文件大小将没有被很大程度的限制。

    在下载业务中,只要select出相应学生的字段,然后在jsp页面写一个<a>链接就可以指定到某个学生的作业进行下载了。


    下面给出相应代码。

    上传Action

package com.edu.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.struts2.ServletActionContext;
import com.edu.po.Student;
import com.edu.service.StudentService;
import com.opensymphony.xwork2.ActionSupport;
public class StudentUploadFilesAction extends ActionSupport{
 //设置数据库保存路径
 private String s_path;
 //设置学生字段编号
 private String s_no;
 //设置文件名
 private String title;
 //设置文件
 private File upload;
 //设置上传文件类型
 //private String uploadContentType;
 //设置上网文件名称
    private String uploadFileName;
    
    //接受依赖注入的属性
    private String savePath;
    
    //业务逻辑组件
    private StudentService studentService;
   
    //设置业务逻辑组件的方法
    public void setStudentService(StudentService studentService) {
  this.studentService = studentService;
 }
 //接受依赖注入的方法
    public void setSavePath(String value) {
        this.savePath = value;
    }
    private String getSavePath() throws Exception {
        return ServletActionContext.getRequest().getRealPath(savePath);
    }
 public String getTitle() {
  return title;
 }
 public void setTitle(String title) {
  this.title = title;
 }
 
 public File getUpload() {
  return upload;
 }
 public void setUpload(File upload) {
  this.upload = upload;
 }
// public String getUploadContentType() {
//  return uploadContentType;
// }
// public void setUploadContentType(String uploadContentType) {
//  this.uploadContentType = uploadContentType;
// }
 public String getUploadFileName() {
  return uploadFileName;
 }
 public void setUploadFileName(String uploadFileName) {
  this.uploadFileName = uploadFileName;
 }
 
 
 public String getS_path() {
  return s_path;
 }
 public void setS_path(String sPath) {
  s_path = sPath;
 }
 public String getS_no() {
  return s_no;
 }
 public void setS_no(String s_no) {
  this.s_no = s_no;
 }
 public String execute() throws Exception {
  Student s=studentService.queryStudentScheduledByID(s_no);
  s.setS_path("StudentUpload/"+getUploadFileName());
  studentService.updateStudentScheduled(s);
  
        // 以服务器的文件保存地址和原文件名建立上传文件输出流
        FileOutputStream fos = new FileOutputStream(getSavePath() + "//"+ getUploadFileName());
        FileInputStream fis = new FileInputStream(getUpload());
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = fis.read(buffer)) > 0) {
            fos.write(buffer, 0, len);
        }
        
        //关闭输入输出流
        fis.close();
        
        fos.close();
        
        return SUCCESS;
    }
}

上传jsp

<body>

  

  <s:iterator value="#request.name" id="student">

   你好,<s:property value="#student.s_name"/>

   <hr>

    <center>

     <h1>学生上传文件</h1>

      <form action="studentuploadfiles.action?s_no=<s:property value="#student.s_no"/>" method="post" enctype="multipart/form-data"> 

      文件标题:<input type="text" name="title"><br />

      选择文件:<input type="file" name="upload"><br />

      <input type="submit" value="上传">

    </form>

    </center>

     <hr>

   </s:iterator>

  </body>


在spring配置文档配置好以来注入,然后在sturts配置文档配置相应Action,这里使用拦截器规定了文件大小以及上传路径

  <!-- studentuploadfiles.action 学生上传文件 -->

         <action name="studentuploadfiles" class="studentUploadFilesAction">

            <interceptor-ref name="fileUpload"> 

              

                <param name="maximumSize">1024*1024</param> 

            </interceptor-ref> 

            <interceptor-ref name="defaultStack"/>   

            <!-- 保存路径savePath依赖注入 -->         

            <param name="savePath">/StudentUpload</param>

            <result name="input"> /StudentUploadFiles.jsp</result> 

            <result name="success">/StudentUploadFilesSuccess.jsp</result>  

        </action>

下载jsp

下载jsp比较简单,使用链接下载文件的方法,在action中获取了学生信息,然后传递给List对象,再iterator出来,这样子就可以下载指定的学生文件了。

  <body>

    <center>

     <h2>学生作业列表</h2>

     <table border="1">

      <tr>

       <td>学生姓名</td>

       <td>学生所属学院</td>

       <td>学生所属系别</td>

       <td>学生作业</td>

      </tr>

      <s:iterator value="#request.dow" id="file">

       <tr>

        <td><s:property value="#file.s_name"/></td>

        <td><s:property value="#file.s_college"/></td>

        <td><s:property value="#file.s_department"/></td>

        <td><a href="<s:property value="#file.s_path"/>">下载学生作业</a></td>

       </tr>

      </s:iterator>

     </table>

    </center>

  </body>

你可能感兴趣的:(数据库,ssh,上传与下载)