SpringMVC 文件上传和下载 & MultipartFile+ajax图片上传

这是在原来的spring+springmvc+mybatis项目基础上加的文件上传与下载,如果有不懂spring+springmvc+mybatis框架集成的也可以点击这里.查看。

单文件上传

在spring-mvc中配置文件上传的解析器

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--  默认编码   -->
    <property name="defaultEncoding" value="utf-8" />
    <!--  文件大小最大值  -->
    <property name="maxUploadSize" value="10485760000" />
    <!-- 内存中的最大值   -->
    <property name="maxInMemorySize" value="40960" />
</bean>

编写Controller层

//文件上传
@RequestMapping("upload")
    public ModelAndView uploadFile(MultipartFile uploadFile,HttpSession session){
        //获取上传文件名
        String filename = uploadFile.getOriginalFilename();
        //获取webapp下的img文件夹的绝对路径作为前半部分路径
        String Path = session.getServletContext().getRealPath("/img");
        //将文件的前半部分路径与文件名拼接
        File file = new File(Path, filename);
        try {
            uploadFile.transferTo(file);
        } catch (IllegalStateException | IOException e) {
            e.printStackTrace();
        }
      ModelAndView mv = new ModelAndView();
		mv.setViewName("jsp/index2");
		mv.addObject("img", filename);//为了前台展示需要文件名
		return mv;
    }
    
//文件下载
@RequestMapping (value = "/download")
	public void download(HttpServletRequest request, HttpServletResponse response, @Param ("filename") String filename) throws IOException {
		//设置响应流中文件进行下载
		response.setHeader("Content-Disposition", "attachment;filename" + filename);
		//把二进制流放入到响应体中
		ServletOutputStream os = response.getOutputStream();
		//获取文件路径
		String path = request.getSession().getServletContext().getRealPath("/img");
		File file = new File(path, filename);
		byte[] bytes = FileUtils.readFileToByteArray(file);
		os.write(bytes);
		os.flush();
		os.close();
	}

网页代码:

在这里插入图片描述
到这里单文件上传就已经完成了,下面就是最后效果
在这里插入图片描述
在这里插入图片描述

多文件上传

多文件上传即在原本上传的基础上,将传入参数MultipartFile uploadFile修改为MultipartFile[] uploadFile数组形式,在上传时就可以遍历这个数组来完成多文件上传

@RequestMapping("upload")
    public ModelAndView uploadFile(MultipartFile[] uploadFile,HttpSession session){
        //获取上传文件名
        for (int i = 0; i < uploadFile.length; i++) {
            String filename = uploadFile[i].getOriginalFilename();
            //获取WebRoot下的images文件夹的绝对路径作为前半部分路径
            String leftPath = session.getServletContext().getRealPath("/images");
            //将文件的前半部分路径与文件名拼接
            File file = new File(leftPath, filename);
            try {
                uploadFile[i].transferTo(file);
            } catch (IllegalStateException | IOException e) {
                e.printStackTrace();
            }
        }
        ModelAndView mv = new ModelAndView();
        mv.setViewName("index");
        return mv;
    }

jsp页面

<form action="${pageContext.request.contextPath }/upload" method="post" enctype="multipart/form-data">
   <h2>文件上传</h2>
      文件1:<input type="file" name="uploadFile"/><br/>
      文件2:<input type="file" name="uploadFile"/><br/>
      文件3:<input type="file" name="uploadFile"/><br/>
   <input type="submit" value="上传"/>
</form>


以上是基于form表单的上单,下面来给大家介绍用ajax的方式来上传图片

MultipartFile+ajax图片上传

网页代码

<form id="uploadForm">
    <input type="file" name="uploadFile" class="file">
     <input type="button" class="save" value="保存">
</form>

js代码

    $(".save").click(function () {
            var file = $('.file')[0].files[0];
            var formData = new FormData();
            formData.append("file_data", file);
            $.ajax({
                url: url,//请求路径
                type: 'POST',
                cache: false,
                data: formData,
                processData: false,
                contentType: false,
             success/error方法省略
        });

controller层

跟上面的controller一样,只是在 MultipartFile uploadFile前面加个@RequestParam (“file_data”)
在这里插入图片描述

注意 :
一定要在SpringMVC的xml文件中配置上传解析器,否则会报错
Unable to process parts as no multi-part configuration has been provided,
即无法处理部件,因为未提供多部件配置

个人心得: 在做图片上传下载的功能板块的时候,主要是通过MultipartFile和IO流等来返回上传图片的名称,再利用img标签来实现展示图片和通过图片名下载图片。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值