目录
一:利用原生的javaweb进行文件上传下载
二:下载文件
1:原生api下载文件
2:利用springmvc的ResponseEntity下载文件[]>
1:导入原生api包,方便使用原生HttpServletRequest
2:利用文件流获取文件并封装到ResponseEntity
三:文件上传
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文件上传下载链接
这时我们运行,它便是以Servlet形式进行文件下载的了。然而出现了两个问题:
1.当我们点击xxx.txt时,它仍是在浏览器中打开。
原因:是因为我们没有设置以附件的形式下载。
2.当我们点击xxx.zip时,它是提示下载了,但名称错误,而且没有下载类型。
原因:我们没有设置响应的mimetype。
javax.servlet javax.servlet-api 4.0.1
/**
* 指定返回ResponEntity实体;返回特定的文件
* @return
*/
@RequestMapping("/getfile")
public ResponseEntity 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 stringResponseEntity = new ResponseEntity(tmp, headers, HttpStatus.OK);
return stringResponseEntity;
}
commons-fileupload commons-fileupload 1.4
注:文件上传解析器id必须为 multipartResolver
@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 "文件上传成功!";
}
}
@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 "文件上传成功!";
}
org.glassfish.jersey.media
jersey-media-multipart
2.25
在web.xml中注册:只需要在Jersey的ServletContainer中添加initparam即可:
jersey.config.server.provider.classnames
org.glassfish.jersey.media.multipart.MultiPartFeature
@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中的每一个实体项。该标签可以绑定如下一些类型:
第一种方式我们采用的是直接使用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";
}