springMVC文件的上传和下载

 因为之前做的上传下载,在我本机好用,部到服务器就不好用,我一气之下,决定把步骤和功能分解记录一下。

普通表单-文件上传

前端使用的是普通的表单,进行文件上传

<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 οnclick="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";
}

结果:成功上传。

根据加入业务写上传逻辑即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值