servlet获取上传的文件,servlet 下载文件
00-1010上传和下载文件1。文件上传详情2。文件上传3。文件下载
目录
00-1010有一个表单标签,方法-post请求(因为get有长度限制)
表单的属性encType值必须是multipart/form-data。
提交的数据以多种方式拼接(每个表单项一个数据段),然后以二进制流的形式发送到服务器。
在form标记中使用input type=file 来添加上传的文件。
编写服务器代码(Servlet接收)来接受和处理上传的数据。
上传文件http请求信息:
请求头:内容类型3360多部分/形式数据;boundary=-webkitformboundary 3d 75 eot 35 lus 7
解析:
Content-Type表示提交的数据类型multipart/form-data表示分段提交服务器边界表示每段数据的分隔符,值:-webkitformboundaryxif 4 fez po 9 c 8 l 4 p由浏览器每次随机生成,是每段数据的分隔符。在每个段落中,第一行是表单项的描述,然后有一个空行,下面是提交的值。请求正文:
-webkitformboundary CD 3g 75 eot 35 lus 7 content-disposition : form-data;name=用户名
朱-webkitformboundary CD 3g 75 eot 35 lus 7 content-disposition : form-data;name= photofilename= head . jpg content-type :图像/jpeg
文件的信息(此处省略多时)-webkitformboundary 3d 75 eot 35 lus 7-
因为客户端通过stream提交yes,所以我们需要通过stream获取,这是不允许的:req . getparameter( username );
正确用法:
@ override protected void dopost(http servlet请求req,http servlet响应resp)抛出servlet异常,ioexception {system.out.println(上传成功);servlet inputStream inputStream=req . getinputstream();//Get字节输入流byte[]buffer=new byte[1024]first;//buffer int read count=0;while((read count=inputstream . read(buffer))!=-1) {//上面所有的请求体system . out . println(new string(buffer,0,readcount))都打印出来;}}
00-1010这种文件上传(常用)有很多第三方提供的API,我们使用,可以帮助我们分析接收到的数据。
示例:commons-fileupload-1.2.1.jar(取决于commons-io-1.4.jar)
导入两个jar包来解析关键类:
ServletFileUpload类:用于解析上传数据的FileItem类:每个表单项。Servlet文件上传中的方法。//判断当前上传的数据是否为多终端格式。并不是说公共布尔servlet file upload . is multipartcontent(http servlet Request req)//不能解析上传的数据,FileItem是指每个表单项中的方法Public ListFileItem Parse Request(http servlet Request req)//FileItem。/确定当前表单项目是普通表单项目还是文件上载类。
型,true表示普通的public boolean isFormField() // 获取表单项name属性值public String getFieldName()// 获取当前表单项的值public String getString() // 可传入字符集,防止乱码,一开始req.setCharacterEncoding("UTF-8");也行// 获取上传的文件名public String getName()// 将上传的文件写道 参数file所指向的磁盘位置public void write(File file)Servlet上传文件示例:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); // 防止乱码 resp.setContentType("text/html; charset=utf-8"); String savePath = getServletContext().getRealPath("/WEB-INF/uploadFile"); //保存的路径 // 首先判断上传的数据是否是多段的数据 if (ServletFileUpload.isMultipartContent(req)) { FileItemFactory fileItemFactory = new DiskFileItemFactory(); // 创建FileItemFactory工厂的实现类, // 创建用于解析上传数据的工具类 ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory); try { List<FileItem> list = servletFileUpload.parseRequest(req); // 解析,得到每一个表单项 for (FileItem fileItem : list) { if (fileItem.isFormField()) { // 普通表单项 System.out.print("表单项的name属性值:" + fileItem.getFieldName()); System.out.println(" 表单项的value:" + fileItem.getString("UTF-8")); } else { // 文件类型 System.out.print("文件的name属性值:" + fileItem.getFieldName()); System.out.println(" 上传的文件名:" + fileItem.getName()); // 一般会保存到用户访问不能直接访问的目录下 File.separator是系统默认路径分隔符,win下是 / // (下面这是保存到了部署的真是目录下,保存到了服务器中) // 可以用UUID保证文件名的唯一性,防止文件覆盖。 // 防止单个目录文件过多影响读写速度,还可以使用目录生成算法分散储存 fileItem.write(new File(savePath + File.separator + fileItem.getName())); //fileItem.delete(); //关闭资源 } } } catch (Exception e) { e.printStackTrace(); } }}
3. 文件下载
客户端 ->(发送请求告诉服务器我要下载什么文件) -> 服务器
服务器干的内容:
获取要下载的文件名读取要下载的文件内容通过响应头告诉客户端返回的数据类型是什么 (和要下载的类型一致)告诉的客户端收到的数据是用于下载使用(还是用响应头设置)把下载的的文件内容回传给客户端下载这个也能用 commons-io-1.4.jar
的IOUtils 类:
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); // 防止乱码 resp.setCharacterEncoding("UTF-8"); //1.获取要下载的文件名路径名,并通过ServletContext读取读取文件 String downloadFileName = "head.jpg"; // 我们这里写死了 ServletContext servletContext = getServletContext(); String savePath = servletContext.getRealPath("/WEB-INF/upload"); //以前上传文件保存的目录 String downloadPath = savePath + File.separator + downloadFileName; //2.告诉客户端返回的类型 String downloadType = servletContext.getMimeType(downloadPath); //获取要下载文件的类型 (这个是image/jpeg) resp.setContentType(downloadType); // (和要下载的类型一样) //3.告诉客户端收到的数据是用于下载的,不是直接显示在页面的 // Content-Disposition表示收到的数据怎么处理,attachment表示附件下载使用,filename表示下载文件的名字 // filename名可以不和本地的名字一样,当有中文时会乱码,因为http协议设置的的时候不支持中文,需要进行url编码 /resp.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName); resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(downloadFileName, "UTF-8")); InputStream resourceAsStream = servletContext.getResourceAsStream(downloadPath); // getResourceAsStream() 传入文件路径,读取文件!!!!!!!!!!!!! // 4.commons-io-1.4.jar中有IOUtils我们可以直接用,不用自己read() write()了 ServletOutputStream outputStream = resp.getOutputStream(); // 获取响应的输出流 IOUtils.copy(resourceAsStream, outputStream); // 读取输入流的信息复制给输出流,输出给客户端,传入一个输入流和输出流 (字节字符流都行)}
到此这篇关于Servlet文件的上传与下载详解的文章就介绍到这了,更多相关Servlet上传下载文件内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。