因为之前做的上传下载,在我本机好用,部到服务器就不好用,我一气之下,决定把步骤和功能分解记录一下。
普通表单-文件上传
前端使用的是普通的表单,进行文件上传
<form action="/ssm/testC/formPost" method="post" enctype="multipart/form-data"> <span>文档选择:</span><input name="file" type="file"><br> <button type="submit">保存</button> </form>
表单提交到方法formPost()
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile;
@RequestMapping(value = "formPost") public String formPost(@RequestParam("file")MultipartFile uploadFile) throws IOException { logger.info("进入方法!================tempUpload"); //上传文件名 String filename = uploadFile.getOriginalFilename(); String path = "/opt/doc"; File filepath = new File(path,filename); //判断路径是否存在,如果不存在就创建一个 if (!filepath.getParentFile().exists()) { filepath.getParentFile().mkdirs(); } //将上传文件保存到一个目标文件当中 uploadFile.transferTo(new File(path + File.separator + filename)); logger.info("走出方法!================tempUpload"); return "/base/message"; }
成功了就将返回这个message页面,页面只有成功两个字
结果:文件成功上传,存储在ubuntu的opt目录下,通过那个路径path控制,注(存储的文件,最好不要使用相对路径,存储在tomcat的哪个文件夹中,否则tomcat如果一重启,所存的文件可能将不复存在,你说气不气)
文件下载
http://XX.XXX.XX.XXX:8080/ssm/testC/downLoad
我用这条地址当作我下载的地址,等我下载程序写好了,直接访问即可。
downLoad()方法
import java.io.UnsupportedEncodingException;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity;
import org.apache.commons.io.FileUtils;
@RequestMapping(value = "downLoad") public ResponseEntity<byte[]> downLoad() throws IOException { //下载文件路径 String path = "/opt/doc"; String name = "出差委托许可申请书.docx"; File file = new File(path + File.separator + name); HttpHeaders headers = new HttpHeaders(); //下载显示的文件名,解决中文名称乱码问题 String downloadFielName = new String(name.getBytes("UTF-8"),"iso-8859-1"); //通知浏览器以attachment(下载方式)打开图片 headers.setContentDispositionFormData("attachment", downloadFielName); //application/octet-stream : 二进制流数据(最常见的文件下载)。 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); }
结果:成功下载。
文件删除
http://XX.XXX.XX.XXX:8080/ssm/testC/delete
使用这个地址做删除操作
delete()方法
@RequestMapping(value = "delete") public String delete(){ //下载文件路径 String path = "/opt/doc"; String name = "出差委托许可申请书.docx"; File targetFile = new File(path, name); if (targetFile.exists()) { targetFile.delete(); } return "/base/message"; }
结果:成功删除
看来,寻常的删除,下载基本上问题都是不大的,基本就是文件的上传那部分,因为我在项目里用的上传是ajaxSubmit传的表单,所以可能里面有一些不知道什么问题的在里面,我上网查了一下有个人这么说
我不知道这个马丁·库伯是谁,我看他的大致意思就是说,在用这个 MultipartFile file 上传文件的同时,不能使用 HttpServletRequest request 再来传参数了,差不多就是这个意思,否则会引起这个 request 的冲突。接下来我就试验看看。
ajax表单-文件上传
后台程序不用动,前台的部分表单加上id
id="fileForm"
<script> function submitForm() { $("#fileForm").ajaxSubmit(); } </script>
结果:成功上传,没有异常,只不过上传的时候页面没反应,因为没有回调。
ajax表单-参数-文件上传
把上面那个的表单改一下,加个参数其余不变,进行尝试
<form id="fileForm" action="/ssm/testC/formPost" method="post" enctype="multipart/form-data"> <span>文档选择:</span><input name="file" type="file"><br> <span>参数:</span><input name="para" type="text" value="ok"><br> <a onclick="submitForm();">提交</a> </form>
结果:成功上传,我改一下后台方法,加上 HttpServletRequest request 进行尝试
import javax.servlet.http.HttpServletRequest;
@RequestMapping(value = "formPost") public String formPost(@RequestParam("file")MultipartFile uploadFile, HttpServletRequest request) throws IOException { System.out.println(request.getParameter("para")); //上传文件名 String filename = uploadFile.getOriginalFilename(); String path = "/opt/doc"; File filepath = new File(path,filename); //判断路径是否存在,如果不存在就创建一个 if (!filepath.getParentFile().exists()) { filepath.getParentFile().mkdirs(); } //将上传文件保存到一个目标文件当中 uploadFile.transferTo(new File(path + File.separator + filename)); return "/base/message"; }
结果:成功上传。
根据加入业务写上传逻辑即可。