天天看点

JavaWeb-23-SpringMVC文件上传下载一:利用原生的javaweb进行文件上传下载二:下载文件三:文件上传

目录

一:利用原生的javaweb进行文件上传下载

二:下载文件

1:原生api下载文件

2:利用springmvc的ResponseEntity下载文件[]>

1:导入原生api包,方便使用原生HttpServletRequest

2:利用文件流获取文件并封装到ResponseEntity

3:jersey文件下载

三:文件上传

1:springmvc上传文件

1.1:导包

1.2:配置文件上传解析器

1.3:文件上传页面

1.4:文件上传处理器

2:Springmvc上传多文件

3:jersey框架上传文件

3.1:导包-maven中添加multipart的依赖:

3.2:配置-需要在Jersey中引入MultipartFeature。MultiPartFeature是Jersey中针对Multipart的一种特征。

3.3:写对应的后台逻辑

3.4:完整例子

一:利用原生的javaweb进行文件上传下载

原生javaweb文件上传下载链接

二:下载文件

1:原生api下载文件

JavaWeb-23-SpringMVC文件上传下载一:利用原生的javaweb进行文件上传下载二:下载文件三:文件上传

这时我们运行,它便是以Servlet形式进行文件下载的了。然而出现了两个问题:

1.当我们点击xxx.txt时,它仍是在浏览器中打开。

              原因:是因为我们没有设置以附件的形式下载。

2.当我们点击xxx.zip时,它是提示下载了,但名称错误,而且没有下载类型。

             原因:我们没有设置响应的mimetype。

JavaWeb-23-SpringMVC文件上传下载一:利用原生的javaweb进行文件上传下载二:下载文件三:文件上传

2:利用springmvc的ResponseEntity<byte[]>下载文件

1:导入原生api包,方便使用原生HttpServletRequest

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
</dependency>
           

2:利用文件流获取文件并封装到ResponseEntity

/**
     * 指定返回ResponEntity实体;返回特定的文件
     * @return
     */
    @RequestMapping("/getfile")
    public ResponseEntity<byte[]> test7(HttpServletRequest httpRequest) throws IOException {
        //得到请求路径
        String contextPath = httpRequest.getContextPath();
        //找到系统的根路径
        ServletContext servletContext = httpRequest.getServletContext();
        //得到文件的真实路径
        String realPath = servletContext.getRealPath("/WEB-INF/dispatcher-servlet.xml");
        System.out.println("绝对路径:"+realPath);

        //拿到文件流
        FileInputStream fileInputStream = new FileInputStream(realPath);

        byte[] tmp = new byte[fileInputStream.available()];

        fileInputStream.read(tmp);
        fileInputStream.close();

        //设置请求头,制定文件类型和文件名称
        MultiValueMap headers = new HttpHeaders();
        headers.add("Content-Disposition","attachment;filename=dispatcher-servlet.xml");

        ResponseEntity<byte[]> stringResponseEntity = new ResponseEntity<byte[]>(tmp, headers, HttpStatus.OK);
        return stringResponseEntity;
    }
           

3:jersey文件下载

jersey文件下载以及excel导出 

三:文件上传

1:springmvc上传文件

1.1:导包

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

1.2:配置文件上传解析器

<!--配置文件解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="#{10240000}"></property>
    <property name="defaultEncoding" value="utf-8"></property>
</bean>
           

注:文件上传解析器id必须为 multipartResolver

JavaWeb-23-SpringMVC文件上传下载一:利用原生的javaweb进行文件上传下载二:下载文件三:文件上传

1.3:文件上传页面

<form action="/upload" method="post" enctype="multipart/form-data">
    用户文件:<input type="file" name="filename"><br/>
    用户名:  <input type="text" name="username"><br/>
    <input type="submit" value="提交">

</form>
           

1.4:文件上传处理器

@Controller
public class FileUploadController {

    @ResponseBody
    @RequestMapping(value = "/upload",method = RequestMethod.POST)
    public String upload(@RequestParam(value = "username",required = false)String username,
                         @RequestParam("filename")MultipartFile multipartFile, Model model){
        System.out.println("username:"+username);
        //这是页面上的文件字段的字段名
        System.out.println("finename:"+multipartFile.getName());
        //文件的名字
        System.out.println("finename:"+multipartFile.getOriginalFilename());

        try {
            //保存文件
            multipartFile.transferTo(new File("F:\\"+multipartFile.getOriginalFilename()));
            System.out.println("end");
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "文件上传成功!";
    }
}
           
JavaWeb-23-SpringMVC文件上传下载一:利用原生的javaweb进行文件上传下载二:下载文件三:文件上传

2:Springmvc上传多文件

<form action="/uploads" method="post" enctype="multipart/form-data">
        用户文件:<input type="file" name="filename"><br/>
        用户文件:<input type="file" name="filename"><br/>
        用户文件:<input type="file" name="filename"><br/>
        用户名:  <input type="text" name="username"><br/>
        <input type="submit" value="提交">

    </form>
           
@ResponseBody
    @RequestMapping(value = "/uploads",method = RequestMethod.POST)
    public String uploads(@RequestParam(value = "username",required = false)String username,
                         @RequestParam("filename")MultipartFile[] multipartFiles, Model model){
        System.out.println("username:"+username);

        try {
            for(MultipartFile file:multipartFiles){
                //保存文件
                file.transferTo(new File("F:\\haha\\"+file.getOriginalFilename()));

            }
            System.out.println("end");
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "文件上传成功!";
    }
           

3:jersey框架上传文件

3.1:导包-maven中添加multipart的依赖:

<dependency> 

     <groupId>org.glassfish.jersey.media</groupId> 

     <artifactId>jersey-media-multipart</artifactId> 

     <version>2.25</version>

 </dependency>

3.2:配置-需要在Jersey中引入MultipartFeature。MultiPartFeature是Jersey中针对Multipart的一种特征。

在web.xml中注册:只需要在Jersey的ServletContainer中添加initparam即可:

<init-param>

        <param-name>jersey.config.server.provider.classnames</param-name>

        <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>

    </init-param>

3.3:写对应的后台逻辑

@POST
@Path("image1")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String upload(@FormDataParam("file") InputStream fileInputStream,
        @FormDataParam("file") FormDataContentDisposition disposition, @Context ServletContext ctx) {
    
    return "success";
}
           

 简单解释一下这段代码:

1,请求必须是POST的,这个不用多说;

2,请求返回json格式响应;

3,Consumes这次设置的是MediaType.MULTIPART_FORM_DATA,这个很重要,因为要能够上传,需要要求表单的提交格式为multipart/form-data;

4,重点在于资源方法的参数,在这里,我们使用了@FormDataParam(该标签来源于jersey的multipart包),该标签能够在资源方法上绑定请求编码类型为multipart/form-data中的每一个实体项。该标签可以绑定如下一些类型:

3.4:完整例子

第一种方式我们采用的是直接使用InputStream来提供上传文件的输入流;

@POST
@Path("image1")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String upload(@FormDataParam("file") InputStream fileInputStream,
        @FormDataParam("file") FormDataContentDisposition disposition, @Context ServletContext ctx) {
 
    File upload = new File(ctx.getRealPath("/upload"),
            UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(disposition.getFileName()));
    try {
        FileUtils.copyInputStreamToFile(fileInputStream, upload);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "success";
}
           

第二种方式,我们使用较为底层的FormDataBodyPart来完成。综合两种方式,更建议使用第一种方式来完成文件上传。 

@POST
@Path("image2")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String upload2(@FormDataParam("file") FormDataBodyPart bp, @Context ServletContext ctx) {
    File upload = new File(ctx.getRealPath("/upload"), UUID.randomUUID().toString() + "."
            + FilenameUtils.getExtension(bp.getFormDataContentDisposition().getFileName()));
    try {
        FileUtils.copyInputStreamToFile(bp.getValueAs(InputStream.class), upload);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "success";
}