先来实现上传。
写上传不管语言,都要先注意前端的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() ?创建当前文件(在存储中)
*/
?
struts实现文件上传和下载。
原文地址:https://www.cnblogs.com/NoYone/p/8278916.html