天天看點

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";
}