java http 下载大文件下载_java实现大文件上传和下载

【文件上传和下载】是很多系统必备功能, 比如PM\OA\ERP等;系统中常见的开发模式有B/S和C/S,而前者主要是通过浏览器来访问web服务器,一般采用七层协议中的【应用层http】进行数据传输,后者主要通过编程语言开发的app作为客户端来访问服务端,一般采用七层协议中的【传输层tcp】进行数据传输。文章主要完成简单java web涉及的文件上传和下载功能。正文1. java原生servlet实现:pom.xml配置:javaxjavaee-api8.0providedjavaxjavaee-web-api8.0providedjavax.servletjstl1.runtimeweb.xml配置:/WEB-INF/view/jsp/upload/upload.jspUploadServletpers.chaffee.servlet.UploadServletUploadServlet/UploadFileServletservlet实现:@WebServlet("/UploadServlet")public class UploadServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) {//根据文件扩展名设置文件MIME类型resp.setContentType(getServletContext().getMimeType("hello.txt"));//设置下载消息响应,提示文件保存attachmentresp.setHeader("Content-Disposition", "attachment;filename=" + "hello");/** 设置缓冲区* is.read(b)当文件读完时返回-1*/try {//输入流为项目文件,输出流指向浏览器InputStream is = new FileInputStream("E:\\hello.txt");// 提供了将二进制数据写入响应的流ServletOutputStream os = resp.getOutputStream();int len = -1;byte[] b = new byte[1024];while ((len = is.read(b)) != -1) {os.write(b, 0, len);}//关闭流is.close();os.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) {// 文件上传到本地磁盘工厂类DiskFileItemFactory factory = new DiskFileItemFactory();//设置内存缓冲区的大小factory.setSizeThreshold(20480);//设置临时文件目录,供上传文件过大时临时存储factory.setRepository(new File("F:\\f"));//文件上传操作核心类ServletFileUpload upload = new ServletFileUpload(factory);//设置限制单个上传文件的大小upload.setFileSizeMax(50480);//设置限制总上传文件大小upload.setSizeMax(80480);// 这个路径相对当前应用的目录try {List formItems = upload.parseRequest(req);if (formItems != null && formItems.size() > 0) {// 迭代表单数据for (FileItem item : formItems) {// 处理不在表单中的字段if (!item.isFormField()) {File storeFile = new File("F:\\fromweb_" + item.getName());// 保存文件到硬盘item.write(storeFile);}}}} catch (FileUploadException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}}upload.jsp:Title

文件上传实例

选择一个文件: 下载2. java web主流框架【ssm】实现:pom.xml配置org.springframeworkspring-core${spring.version}org.springframeworkspring-webmvc${spring.version}org.springframeworkspring-web${spring.version}org.springframeworkspring-context${spring.version}org.springframeworkspring-context-support${spring.version}org.springframeworkspring-aop${spring.version}org.springframeworkspring-aspects${spring.version}web.xml配置contextConfigLocationclasspath*:*.xmlorg.springframework.web.context.ContextLoaderListenerorg.springframework.web.util.IntrospectorCleanupListenerdispatcherServletorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:spring-mvc.xml1dispatcherServlet/service/*spring-mvc.xml:<?xml version="1.0" encoding="UTF-8"?>servlet实现:@RequestMapping(value = "/upload2", method = RequestMethod.POST, consumes = {"multipart/form-data"})public ModelAndView postUpload(HttpServletRequest request, HttpServletResponse response) {//文件上传核心类CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());//判断request是否有文件上传if (multipartResolver.isMultipart(request)) {//通过MultipartHttpServletRequest解析上传请求中的文件MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;//获取上传请求中的所有文件Iterator iter = multiRequest.getFileNames();while (iter.hasNext()) {//转换成spring支持的文件类型MultipartFileMultipartFile file = multiRequest.getFile(iter.next());if (file != null) {File localFile = new File("F:\\f\\" + file.getOriginalFilename());try {//将上传文件写到指定位置,此处是本地文件夹file.transferTo(localFile);} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}}ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("upload/upload2");return modelAndView;}@RequestMapping(value = "/download", method = RequestMethod.GET)public ResponseEntity downLoad() throws IOException {byte[] responseBody;//获取文件File file = new File("E:\\hello.txt");InputStream is = new FileInputStream(file);responseBody = new byte[is.available()];is.read(responseBody);HttpHeaders headers = new HttpHeaders();//设置文件类型headers.add("Content-Disposition", "attachment;filename=" + file.getName());//设置Http状态码HttpStatus stateCode = HttpStatus.OK;//返回数据ResponseEntity entity = new ResponseEntity<>(responseBody, headers, stateCode);return entity;}小结

截至目前,只初步完成B/S方式的上传和下载,且文件存储方式仅限本地磁盘。而C/S方式的文件传输可以考虑thrift框架,thrift是一种跨平台跨语言的RPC框架,使用过程中发现在数据量不是很大的情况下thrift应用是一种比较合适的C/S解决方案;另外,文件存储方式可以根据具体情况选用文件服务器、数据库等。

详细的配置信息可以参考这篇文章:http://blog.ncmem.com/wordpress/2019/08/12/java%e5%ae%9e%e7%8e%b0%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e5%92%8c%e4%b8%8b%e8%bd%bd/​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值