zoukankan      html  css  js  c++  java
  • 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() 创建当前文件(在存储中)
    */
     
  • 相关阅读:
    Android 程序员不得不收藏的个人博客(持续更新...)
    硬核讲解 Jetpack 之 LifeCycle 源码篇
    秉心说,不一样的 2019
    秉心说 2019 博文合集
    庖丁解牛 Activity 启动流程
    Jetpack Compse 实战 —— 全新的开发体验
    Box 黑科技 —— 支持手机端反编译 !
    “无处不在” 的系统核心服务 —— ActivityManagerService 启动流程解析
    如何正确的在 Android 上使用协程 ?
    【Medium 万赞好文】ViewModel 和 LIveData:模式 + 反模式
  • 原文地址:https://www.cnblogs.com/NoYone/p/8278916.html
Copyright © 2011-2022 走看看