目錄
一:利用原生的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下載下傳檔案
這時我們運作,它便是以Servlet形式進行檔案下載下傳的了。然而出現了兩個問題:
1.當我們點選xxx.txt時,它仍是在浏覽器中打開。
原因:是因為我們沒有設定以附件的形式下載下傳。
2.當我們點選xxx.zip時,它是提示下載下傳了,但名稱錯誤,而且沒有下載下傳類型。
原因:我們沒有設定響應的mimetype。
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
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 "檔案上傳成功!";
}
}
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";
}