struts实现文件上传和下载。

先来实现上传。

写上传不管语言,都要先注意前端的form那儿有个细节。

<form name="form1" method="POST" enctype="multipart/form-data">

即这个enctype,编码方式要加上multipart/form-data,这说明了以二进制形式传输数据(即不经过编码处理)。

要是考虑安全性,还要对MIME(Multipurpose Internet Mail Extensions,用了描述因特网内容类型的)作限制,比方说后台只接受MIME类型为图片的(image/jpeg )。

当然这样也还不是很安全,我现在认为比较安全的是,后台接收文件后,截断后缀名,并指定一个后缀名再放到指定文件夹,这样就算有人上传上来了可执行文件,后缀改了 ,那个文件夹不给执行权限,就比较安全了。

struts.xml配置

<action name="student_uploadClasSchedule" class="com.studentweb.action.StudentAction" method="uploadClasSchedule">
    <!-- 下面这句即可以做到MIME类型判断 -->
    <param name="fileUpload.allowedTypes">text/plain</param>
    <!-- 指定文件保存路径 -->
    <param name="savePath">classchedule</param>    
<result name="SUCCESS" type="redirect">student_showClasSchedule.do</result>
</action>

action处理

    public String uploadClasSchedule() {
        uploadfile(file);
        // 下面几句只是数据库处理,不用在意,文件名等等肯定得存数据库里的。
        ClasSchedule cs = new ClasSchedule();
        cs.setFilename(fileFileName);
        std.addClasSchedule(cs);
        return SUCCESS;
    }

    public void uploadfile(File file) {
        /**
* getRealPath方法就是拿到存储位置的绝对路径,savaPath是在struts.xml里配置好的。
     * File.separator是操作系统的分隔符,linux/unix --- "/" ,windows --- "\\"
*/
final String dstPath = ServletActionContext.getServletContext().getRealPath(this.getSavePath()) + File.separator + fileFileName; try {
//真正把文件保存到本地是这句。 FileUtils.copyFile(file,
new File(dstPath)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public String getSavePath() { return savePath; }

下面是下载

struts.xml配置

<action name="student_downloadcs" class="com.studentweb.action.StudentAction" method="downloadcs">
     <result name="success" type="stream">
<!-- 这儿设置下载文件的MIME类型,此处为docx类型,需要自行搜索配置。也可设置编码 --> <param name="contentType">application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=ISO-8859-1</param>
<!--下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为targetFile的属性需要编写getTargetFile()方法  --> <param name="inputName">targetFile</param>
      <!-- attachment这个设置即提醒浏览器弹出下载或直接打开的框,fileName即返回处理过的文件名(解决中文乱码) --> <param name="contentDisposition">attachment;filename="${fileName}"</param> <param name="buffersize">4096</param> </result> </action>

后台处理

    public String downloadcs() {
        return SUCCESS;
    }
    
    public InputStream getTargetFile() {
        String savePath = "classchedule";
        String temp = request.getParameter("filename");
        savePath += File.separator + temp;
// 即以流的形式返回
return ServletActionContext.getServletContext().getResourceAsStream(savePath); } public String getFileName() {
//接受要下载的文件名 String temp
= request.getParameter("filename"); try { temp = new String(temp.getBytes(), "ISO-8859-1"); //解决下载时中文乱码 } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return temp; }

顺便说一下删除吧,主要用的是java.io.File.File里面的方法。

后台处理,接受文件id删除的方式。

    public String deleteCS() {
        String temp = request.getParameter("id");
        int id = Integer.valueOf(temp);
//这儿是删除数据库里的信息 String filename
= std.getFile(id); std.deleteFile(id);
     //这儿是删除实际存储的文件。 String dstPath
= ServletActionContext.getServletContext().getRealPath("/classchedule") + File.separator + filename; File file = new File(dstPath); System.out.println(dstPath+"////"+file.exists()); if(file.exists()) file.delete(); return "DELETEFILE"; }
/** file常用方法
* file.exists() 判断文件是否存在
* file.delete() 删除文件
* file.getParentFile().mkdirs() 在上层文件创建目录
* file.createNewFile() 创建当前文件(在存储中)
*/

 

 

 

posted @ 2018-01-13 13:17  NoYone  阅读(207)  评论(0编辑  收藏  举报