JavaWeb:实现文件上传与下载

文件上传前端处理

  本模块使用到的前端Ajax库为Axio,其地址为GitHub官网。

关于文件上传

  上传文件就是把客户端的文件发送给服务器端。

  在常见情况(不包含文件上传)下,我们POST请求Content-Type是application/x-www-form-urlencoded,这意味着消息内容会经过URL编码,就像在GET请求时URL里的QueryString那样。txt1=hello&txt2=world。为了支持表单上传,我们第一个要设置的请求的Content-Type,即为multipart/form-data,以支持客户端向服务器发送二进制数据。

  一个常见的请求上传格式大概是这样的:

  

基于表单进行上传

  我们首先构建一个简易的文件上传表单,这里面有几个需要注意的地方:

  • 在form中,我们添加了enctype="multipart/form-data" 这条属性,enctype属性规定了在发送到服务器之前应该如何对表单数据进行编码
  • action="upload"> 指明了服务器接受文件的地址。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form name="uploadForm" method="POST" enctype="multipart/form-data" action="upload"><table><tr><td>UserName</td><td><input type="text" name="username"></td></tr><tr><td>upload1</td><td><input type="file" name="file"></td></tr><tr><td><input type="submit" name="submit" value="上传"></td></tr></table></form>
</body>
</html>

  然后,再点击上传按钮后,服务器将会接收到上传请求。

补充:

  在HTML5中,通过在input元素中引入多个multiple属性,使得多个文件的上传变得更加简单,下面均可使一个上传框支持多个文件上传。

<input type="file" name="fieldName" multiple/>
<input type="file" name="fieldName" multiple="multiple"/>
<input type="file" name="fieldName" multiple=""/>

基于FormData进行上传

  FormData对象用以将数据编译成键值对,以便用XMLHttpRequest来发送数据。其主要用于发送表单数据,但亦可用于发送带键数据(keyed data),而独立于表单使用。如果表单enctype属性设为multipart/form-data ,则会使用表单的submit()方法来发送数据,从而,发送数据与传统表单具有同样形式。

  简单来说就是,我们完全用JavaScript代码来拼写表单数据,如下:

var formData = new FormData();//普通字段
formData.append("username", "Groucho");
formData.append("accountnum", 123456); //数字123456会被立即转换成字符串 "123456"// 文件:基于<input type=‘file’/>
formData.append("userfile", fileInputElement.files[0]);// 文件:Blob 对象
var content = '<a id="a"><b id="b">hey!</b></a>'; // 新文件的正文...
var blob = new Blob([content], { type: "text/xml"});
formData.append("webmasterfile", blob);

  接着,我们就可以使用axios,来上传数据,此处需要注意的是,我们需要进行请求头的设置:'Content-Type': 'multipart-/form-data'

//构造表头
let config = {headers: {'Content-Type': 'multipart-/form-data'}}axios.post("//127.0.0.1:8000/web/cam", formData, config).then((response) => {…})).catch((error) =>{…});

  到这里,前端的处理就完成了。  

文件上传后端处理

  表单的正文部分由多个子部分组成,如文本、数值、时间,以及文件等。Servlet3.0版本自带了上传文件的api,无需第三方jar包 。Servlet3.0将上传的文件保存在Part实例中,可以通过request对象根据上传的表单控件的name获取对应的part对象,同时也支持多个文件上传。

@WebServlet("/up")
@MultipartConfig  //使用MultipartConfig注解标注改servlet能够接受文件上传的请求
public class UploadServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {Part part = req.getPart("myfile");String disposition = part.getHeader("Content-Disposition");String suffix = disposition.substring(disposition.lastIndexOf("."),disposition.length()-1);//随机的生存一个32的字符串String filename = UUID.randomUUID()+suffix;//获取上传的文件名InputStream is = part.getInputStream();//动态获取服务器的路径String serverpath = req.getServletContext().getRealPath("upload");FileOutputStream fos = new FileOutputStream(serverpath+"/"+filename);byte[] bty = new byte[1024];int length =0;while((length=is.read(bty))!=-1){fos.write(bty,0,length);}fos.close();is.close();}
}

说明:

  • 这里需要补充一点的是,文件名的保存,Content-Disposition:form-data; name="file"; filename="test.txt" ,需要通过字符串截取得到.
  • 文件存储在服务器当前项目的根目录下的upload文件夹中,通过req.getServletContext().getRealPath()获取服务器的绝对再将上传的文件写入。

文件下载后端处理

  通过servlet的响应设置可以设置服务器响应文件流给客户端实现文件下载,思路是,客户端发送请求给服务端告诉服务端需要下载的文件,服务端读取该文件,转换为输入流,在通过outputstream响应给客户端,不过需要设置response的头信息,下面是完整代码

public class DownServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String file = request.getParameter("file"); //客户端传递的需要下载的文件名String path = request.getServletContext().getRealPath("")+"/"+file; //默认认为文件在当前项目的根目录FileInputStream fis = new FileInputStream(path);response.setCharacterEncoding("utf-8");response.setHeader("Content-Disposition", "attachment; filename="+file);ServletOutputStream out = response.getOutputStream();byte[] bt = new byte[1024];int length = 0;while((length=fis.read(bt))!=-1){out.write(bt,0,length);}out.close();}
}

  

转载于:https://www.cnblogs.com/MrSaver/p/6028503.html

JavaWeb:实现文件上传与下载相关推荐

  1. Javaweb之文件上传与下载

    Javaweb之文件上传与下载 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图 ...

  2. javaWeb实现文件上传与下载 (转)

    文件上传概述 实现web开发中的文件上传功能,需完成如下二步操作: 在web页面中添加上传输入项 在servlet中读取上传文件的数据,并保存到本地硬盘中. 如何在web页面中添加上传输入项? < ...

  3. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  4. JavaWeb学习总结(五十)——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  5. JavaWeb学习总结——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  6. JavaWeb 文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  7. JavaWeb实现文件上传下载功能实例详解

    感谢原文作者分享,原文链接:http://www.jb51.net/article/96745.htm 这篇文章主要介绍了JavaWeb中的文件上传和下载功能的实现,在开发中,文件上传和下载功能是非常 ...

  8. JavaWeb -- Struts1 多文件上传与下载 DownloadAction, DispatchAction

    1. 多文件上传与下载 上传下载jsp: <%@ page language="java" import="java.util.*" pageEncodi ...

  9. Java Web项目中遇到的文件上传与下载问题

    (转发自:https://www.cnblogs.com/xdp-gacl/p/4200090.html)   在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中 ...

最新文章

  1. Django视图之状态保持
  2. python生成回文数
  3. SQL 数据库的使用
  4. Android Studio安装genymotion模拟器
  5. 前端学习(1430):ajax封装五
  6. Anaconda3使用过程中遇到的问题
  7. git can‘t merge 的处理 代码冲突问题的解决
  8. 利用倾斜摄影技术土方工程计算
  9. 存储器基本概念及分类介绍
  10. Effect Modern c++翻译
  11. python 正则表达式量词
  12. 强化学习笔记1:Multi-armed Bandits
  13. 【徕卡全站仪Geocom开发】开发日志#01
  14. EDM邮件营销的七个基本原则
  15. python机器学习思维导图脑图(完整版)
  16. League-X:深度学习+英雄联盟,英雄联盟小地图识别器,标定对面打野位置
  17. max3232ese_供销电子MAX3232ESE+T【全渠道分销系统】
  18. 【大数据开发】SparkCore——利用广播变量优化ip地址统计、Spark2.x自定义累加器
  19. 如何让无源蜂鸣器响起来
  20. 便利蜂是“冬眠”还是“假寐”,只有时间知道

热门文章

  1. 跨域验证cookie与缓存控制
  2. 支持向量机(SVM)复习总结
  3. Android开发学习之路-PopupWindow和仿QQ左滑删除
  4. Java把表导出成Excel的代码
  5. [javaME]摩托罗拉V300-V500-V600同时播放音乐的讲究
  6. 计算机考试忘记备注班级了,2012年计算机二级Access第二十五套上机试题及答案详解...
  7. 就计算机结构与课程的论文,关于计算机组成原理的课程论文(2)
  8. python sqlalchemy core
  9. Linux vi vim 常用快捷键操作(一)
  10. 修改端口_如何修改服务器的远程端口