springMvc-06 JSON与文件上传下载

1、Json

JSON是当前前后端分开开发传递数据首选的数据格式。

这里使用jackson开源包实现JSON数据解析转换。

1.1、导入所需要的包

        <!--JSON数据转换-->
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.12.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.12.2</version>
        </dependency>

1.2、两个注解

@RequestBody

主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);

必须是Post请求,该注解用在方法的形参上。

当请求头的ContentType类型是application/json,application/xml等格式的数据时,需要使用该标注。

能够把json内部包含的变量绑定给对象的包含的属性上。

@ResponseBody

用于返回JSON数据,该注解用在方法上,用来把方法返回的对象自动转为JSON格式并返回给前端。

1.3、测试例子

代码:

package rui.web;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import rui.db.Model.User;

import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;

@Controller
@RequestMapping(value = "/json")
public class jsonController {

    //提交Json数据
    @ResponseBody
    @RequestMapping(value = "put")
    public void showInfo(
            HttpServletResponse response,
            @RequestBody User user) throws Exception {
        System.out.println("提交JSON数据");
        System.out.println(user.toString());

        ObjectMapper jsonTool = new ObjectMapper();
        response.getWriter().write(jsonTool.writeValueAsString(user));
    }

    //返回Json数据
    @ResponseBody
    @RequestMapping(value = "get")
    public User showInfo() {
        User u = new User();
        u.setLoginId("001");
        u.setUserName("王");
        u.setSex("F");
        u.setTelephone("123456789");
        u.setDepartmentId("D01");
        u.setLoves(Arrays.asList("足球", "篮球"));
        return  u;
    }
}

请求测试-请求:

请求测试-提交:用Postman

在Header中增加Content-Type   application/json

数据输出:

2、文件上传与下载

2.1、导入包

        <!--文件上传-->
        <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>

2.2、SpringMVC配置文件添加如下配置

    <!--文件上传配置-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--默认编码-->
        <property name="defaultEncoding" value="UTF-8" />
        <!--最大上传200M-->
        <property name="maxUploadSize" value="209715200" />
        <!--推迟文件解析-->
        <property name="resolveLazily" value="true" />
        <!--临时保存路径-->
        <property name="uploadTempDir" value="uploadFiles/temp" />
    </bean>

2.3、文件上传

前端通过 input表单上传,允许文件多选

<div>头像:<input type="file" name="headImgUpload" multiple="multiple" /></div>

form标记需要增加:  enctype="multipart/form-data" 属性。

保存文件的代码:

参数名需要和input表单的name属性保持一致,否则无法进行参数绑定。

    //用户注册提交
    @RequestMapping(value = "register", method = RequestMethod.POST)
    public String register(Model model,User user,
                           List<MultipartFile> headImgUpload,
                           HttpServletRequest request) {
        System.out.println("执行TestController==2");

        //文件上传保存
        if (headImgUpload != null) {
            for (MultipartFile headImg:headImgUpload) {

                String realPath = request.getServletContext().getRealPath("uploadFiles");
                System.out.println(realPath);
                File file = new File(realPath);
                //不存在,则创建目录
                if (file.exists() == false)
                    file.mkdir();
                
                if (headImg.getSize() > 0) {
                    //获取上传文件名
                    String fileName = headImg.getOriginalFilename();
                    System.out.println(fileName);
                    System.out.println(headImg.getContentType());
                    System.out.println(headImg.getSize());
                    File target = new File(realPath, fileName);
                    try {
                        //保存文件
                        headImg.transferTo(target);
                    } catch (Exception e) {
                        System.out.println("上传失败");
                        e.printStackTrace();
                    }
                }
            }
        }
        model.addAttribute("user", user);
        return "forward:/test/showInfo";
    }

2.4、文件下载

    //文件下载
    @RequestMapping(value="download")
    public ResponseEntity<byte[]> downloadFile(String fileName,
                                               HttpServletRequest request,
                                               HttpServletResponse response) throws Exception
    {
        String downLoadPath = request.getServletContext().getRealPath("downloadFiles");
        System.out.println(downLoadPath);
        File downFile = new File(downLoadPath+File.separator+fileName);
        if(downFile.exists())
        {
            HttpHeaders headers=new HttpHeaders();
            //解决中文乱码
            String downFileName = new String(downFile.getName().getBytes("utf-8"),"iso-8859-1");
            headers.setContentDispositionFormData("attachment",downFileName);
            //设置要下载文件的MIME类型,这句话可以省略
            headers.setContentType("文件的MIME类型");
            byte[] buffer = FileUtils.readFileToByteArray(downFile);
            ResponseEntity<byte[]> entity=new ResponseEntity<byte[]>(buffer,headers, HttpStatus.OK);
            return entity;
        }
        return null;
    }

运行测试:

在浏览器中输入:

 

项目中,文件路径一般都保存在数据库中,通过传入要下载的文件的数据库记录主键,通过查询数据库来获取其它相关的信息。

 

posted @ 2022-02-12 19:16  草莓爸  阅读(139)  评论(0编辑  收藏  举报