`
Wanci
  • 浏览: 4370 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

11-25笔记

 
阅读更多

一、Servlet文件上传

1.上传jsp页面[上传到fileResult.jsp页面]

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>上传文件</title>
  </head>
  <body>
    <form action="fileResult.jsp" method="post" enctype="multipart/form-data">
    <!--method必须设为post,因为get有最大限度256k,太大就带不上去-->
    <!--enctype="multipart/form-data"上传的是多种类型数据,不再只是文本.也就是说当去掉这个标签,传递的便是文本[传输文件的文件名]-->
    username:<input type="text" name="username"/><br/>
    file1:<input type="file" name="file1"/><br/>
    <input type="submit" value="submit"/>
    </form>
  </body>
</html>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*,java.io.*" %><!--导入包-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>上传结果</title>
</head>
<body>
<!--上传http协议,底层是tcp协议。tcp协议是有连接的,可以获得流-->
<%
	InputStream is = request.getInputStream();
	BufferedReader br = new BufferedReader(new InputStreamReader(is));
	String buffer = null;
	while(null != (buffer=br.readLine())){
		out.print(buffer+"<br/>");//读取流中的数据
	}
        //需要关两个流,因为字节输入流是通过request中获取的
	br.close();
	is.close();
 %>
<!--取文本的方式,无法获取文件...-->
<!--username:<%=request.getParameter("username") %>
file1:<%=request.getParameter("file1") %>-->
</body>
</html>

 输出流中打印的信息

 2.Servlet上传[导入commons-fileupload-1.2.2.jar、commons-io-2.0.1.jar,在WebRoot下创建upload文件夹保存上传的文件]

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>上传文件</title>
</head>
<body>
	<form action="servlet/FileUploadServlet" method="post" enctype="multipart/form-data">
<!--上传到指定的servlet类中-->
		username:<input type="text" name="username"/><br/>
		file1:<input type="file" name="file1"/><br/>
		<input type="submit" value="submit"/>
	</form>
</body>
</html>

 servlet类

 

 

package com.struts.servlet;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileUploadServlet extends HttpServlet {
  public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
  // 获得保存上传文件路径,在webRoot下的upload
  String path = request.getRealPath("/upload");
  System.out.println("path=" + path);
  // 确定文件上传到的路径
  DiskFileItemFactory factory = new DiskFileItemFactory();
  // 相当于上传文件的仓库,存放上传文件 这里的File是目录
  factory.setRepository(new File(path));
  // 如果上传的文件比较小,先放在内存中,再放到保存路径中
  // 如果上传的文件比较大,内存不能满足,先放在缓存区中,在保存到指定路径中
  // 上传多大时需要使用缓冲区,可以通过setSizeThreshold()设置
  factory.setSizeThreshold(1024 * 1024);
  // 文件上传
  ServletFileUpload upload = new ServletFileUpload(factory);
  try {
  // 将客户端发送过来的请求进行解析
  List<FileItem> list = (List<FileItem>) upload.parseRequest(request);
  // list中存储的是传过来的多个文件、多个文本
  for (FileItem item : list) {
    String name = item.getFieldName();
    if (item.isFormField()) {// 如果是属性,也就是文本标签而并非文件
      String value = item.getString();
      System.out.println(name + "=" + value);
      request.setAttribute(name, value);
    } else {
      // 上传文件
      // 获得文件名,一般浏览器解析文件名后只要文件名,
      // 而一些浏览器解析方式不同,会将全部文件整个路径输出,
      //对于这些浏览器的解析方式做些处理
      String value = item.getName();
      //当文件名为全路径时,从后往前取到的第一个\之后便是文件名
      //若文件名并非全路径时,从后往前取第一个\是取不到的,返回-1,-1+1=0,从第0位开始取文件名也是对的
      //file1=C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg
      //file1=Chrysanthemum.jpg
      int start = value.lastIndexOf("\\");
      System.out.println("start:"+start);
      String fileName = value.substring(start+1);
      request.setAttribute(name, fileName);
      System.out.println(name + "=" + value);
      System.out.println(name + "=" + fileName);
      //将文件写到指定的路径中(路径下面创建一个文件)
      item.write(new File(path,fileName));
      }
    }
} catch (Exception ex) {
  ex.printStackTrace();
}
//跳转到指定的页面
request.getRequestDispatcher("/fileResult.jsp").forward(request,response);
}
}

 

package com.struts.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileUploadServlet extends HttpServlet {
  public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
  // 获得保存上传文件路径,在webRoot下的upload
  String path = request.getRealPath("/upload");
  System.out.println("path=" + path);
  // 确定文件上传到的路径
  DiskFileItemFactory factory = new DiskFileItemFactory();
  // 相当于上传文件的仓库,存放上传文件 这里的File是目录
  factory.setRepository(new File(path));
  // 如果上传的文件比较小,先放在内存中,再放到保存路径中
  // 如果上传的文件比较大,内存不能满足,先放在缓存区中,在保存到指定路径中
  // 上传多大时需要使用缓冲区,可以通过setSizeThreshold()设置
  factory.setSizeThreshold(1024 * 1024);
  // 文件上传
  ServletFileUpload upload = new ServletFileUpload(factory);
  try {
    // 将客户端发送过来的请求进行解析
    List<FileItem> list = (List<FileItem>) upload.parseRequest(request);
    // list中存储的是传过来的多个文件、多个文本
    for (FileItem item : list) {
      String name = item.getFieldName();
      if (item.isFormField()) {// 如果是属性,也就是文本标签而并非文件
      String value = item.getString();
      System.out.println(name + "=" + value);
      request.setAttribute(name, value);
      } else {
      // 上传文件
      // 获得文件名,一般浏览器解析文件名后只要文件名,
      // 而一些浏览器解析方式不同,会将全部文件整个路径输出,
      //对于这些浏览器的解析方式做些处理
      String value = item.getName();
      //当文件名为全路径时,从后往前取到的第一个\之后便是文件名
      //若文件名并非全路径时,从后往前取第一个\是取不到的,返回-1,-1+1=0,从第0位开始取文件名也是对的
      //file1=C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg
      //file1=Chrysanthemum.jpg
      int start = value.lastIndexOf("\\");
      System.out.println("start:"+start);
      String fileName = value.substring(start+1);
      request.setAttribute(name, fileName);
      System.out.println(name + "=" + value);
      System.out.println(name + "=" + fileName);
      //将文件写到指定的路径中(路径下面创建一个文件)
      //item.write(new File(path,fileName));
      //自定义输出
      OutputStream os = new FileOutputStream(new File(path,fileName));
      InputStream is = item.getInputStream();
      byte[] buffer = new byte[400];
      int length = 0;
      while(-1!=(length=is.read(buffer))){
      os.write(buffer,0,length);
      }
      is.close();
      os.close();
      }
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  //跳转到指定的页面
  request.getRequestDispatcher("/fileResult.jsp").forward(request,response);
 }
}

 对比item.write(new File(path,fileName));与自定义输出的差别

自定义输出大文件时,传入文件的同时会创建一个临时文件。而使用item.write()方法时,内部完成了把后缀名为tmp的文件删除

 

//item.getSize()获得文件传输长度,可以通过ajax动态调用,比对文件大小与传输大小,获得文件传输进度

 

  • 大小: 41.6 KB
分享到:
评论

相关推荐

    2023-04-06-项目笔记 - 第三百二十八阶段 - 4.4.2.326全局变量的作用域-326 -2025.11.25

    2023-04-06-项目笔记-第三百二十八阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的...

    网络管理员笔记-软考笔记(超级详细!!!超级认真)软考学习笔记(带资料!!)a网络管理员考试介绍

    网络管理员笔记-软考笔记(超级详细!!!超级认真)软考学习笔记(带资料!!)a网络管理员考试介绍。都是自己做的!!!制作不易!点个赞哈!!都是根据视频一步一步做出来的,带真题的笔记,考前复习一遍记过!...

    2023-4-8-笔记-第一阶段-第2节-分支循环语句- 4.goto语句 5.本章完 -2024.11.25

    2023-04-08 项目笔记-第一阶段-第2节-分支和循环语句-3.3.2执行流程 3.3.3do语句的特点 3.3.4do while循环中的break和continue 3.4练习 3.4.1练习参考代码:3.4.2折半查找算法 3.4.3猜数字游戏实现 4.goto语句 5....

    halo-backup-markdown-2022-09-25-16-08-11--936459594.zip

    标题中的"halo-backup-markdown-2022-09-25-16-08-11--936459594.zip"表明这是一个备份文件,使用了Markdown格式,并且时间戳显示它是2022年9月25日下午4点8分11秒创建的,这通常是为了记录或保存某个时刻的数据状态...

    《UnixShell实例精解》-学习笔记.doc

    25. sh 26. ps 27. sed 28. cal 29. lp 四、正则表达式基础知识 正则表达式是一种特殊的字符模式,用来在一次搜索中匹配相同字符。常见的正则表达式元字符包括: 1. ^ 行开头定位 2. $ 行末尾定位 3. . 匹配单个...

    华为HCIA-RS学习笔记.rar

    11-VRP基础 12-VRP远程管理 13-VRP文件系统 14-VRP系统管理 15-路由基础 16-静态路由 17-动态路由 18-RIP 19-OSPF 20-路由认证 21-缺省路由的发布 22-交换机基础 23-VLAN 24-VLAN间路由 25-GARP-GVRP ...

    Eclipse插件开发学习笔记 第三四篇(22-25).rar

    Eclipse插件开发 学习笔记 第二篇 核心技术(11-16).rar Eclipse插件开发 学习笔记 第二篇 核心技术(17-21).rar Eclipse插件开发学习笔记 第三四篇(22-25).rar Eclipse插件开发学习笔记 第三四篇(26-28)+原代码.rar ...

    AS3933-学习笔记.pdf

    11. 低功耗聆听模式:在聆听模式下,电流消耗为1.37μA(典型值)。 12. 数据速率:可以在0.5-4kbps之间调整(曼彻斯特)。 13. 曼彻斯特解码时钟恢复:在解码曼彻斯特编码数据时,能够恢复出时钟信号。 14. 数字...

    Oracle-ERP开发笔记

    ### Oracle-ERP开发笔记知识点概览 #### 一、Oracle Forms基础 **1. 设置ITEM为必填项** - 在Oracle Forms中,可以为特定的ITEM(字段)设置必填属性,确保用户在提交表单之前必须填写这些字段。这通常通过属性...

    Eclipse插件开发 学习笔记 第二篇 核心技术(11-16).rar

    Eclipse插件开发 学习笔记 第二篇 核心技术(11-16).rar Eclipse插件开发 学习笔记 第二篇 核心技术(17-21).rar Eclipse插件开发学习笔记 第三四篇(22-25).rar Eclipse插件开发学习笔记 第三四篇(26-28)+原代码.rar ...

    Flash动画制作基础知识-学习笔记.pdf

    例如,电影通常为25帧/秒,而Flash动画的帧频可以根据需求设置,早期的标准是12帧/秒,但现在常提升至24-36帧/秒。 二、Flash制作流程 1. 新建文件:使用Ctrl+N快捷键创建新项目,并在"文档"选项中设置合适的尺寸和...

    RHCE课程笔记

    RHCE课程-RH033Linux基础笔记一 10月25日课程 4、安装LINUX及常用命令介绍 RHCE课程-RH033Linux基础笔记二 10月26日课程 5、文件以及文件权限 RHCE课程-RH033Linux基础笔记三 10月26日部分课程;11月1日课程;11月2...

    Oracle 10g 学习笔记

    │ 融会贯通Oracle数据库的25条基本知识.txt │ 详细讲解Oracle服务器的常用命令行.mht │ └─资料 │ Ora 10G Err_Msg.chm │ Oracle10g_DBA.pdf │ Oracle10G官方文档CHM合集SQL参考手册.pdf │ Oracle9i...

    Python 笔记源码【笔记+教程+示例源码】.zip

    24-机器学习介绍 20-天天果园项目 06-MySQL 19-Django 22-爬虫高级 18-博客项目 14-HTML&CSS第二部分 15-前端项目 08-多线程 16- flask 23-Numpy基础,数据分析 31-股票分析系统 ...30-....25-决策树 ...11-Git

    AI(illustrate)快捷键-课堂笔记,自己总结

    25. **绘制工具组**:如矩形工具(M)、椭圆工具(L)、圆角矩形、多边形工具、星形工具等,都有特定的绘制和修改方法。 26. **文字工具**:`T`,`Alt+上下箭头`调整行距,`Alt+左右箭头`调整字距。 27. **路径...

    狂神笔记,b站狂神说课程笔记大全(最新)

    11、JavaSE:多线程 12、JavaSE:网络编程 13、JavaSE:Gui编程 14、JavaSE:注解和反射 15、MySQL和JDBC 16、前端:Html5 17、前端:CSS3 18、前端:JavaScript、jQuery 19、JavaWeb 20、MyBatis 21、Spring 22、...

    Eclipse插件开发学习笔记 第三四篇(26-28)+原代码.rar

    Eclipse插件开发 学习笔记 第二篇 核心技术(11-16).rar Eclipse插件开发 学习笔记 第二篇 核心技术(17-21).rar Eclipse插件开发学习笔记 第三四篇(22-25).rar Eclipse插件开发学习笔记 第三四篇(26-28)+原代码.rar ...

    C#学习笔记-25个经典问题.pdf

    11. 抽象函数重写基类虚函数 可以,抽象函数可以重写基类的虚函数,但抽象函数本身没有实现,必须在子类中提供具体实现。 12. 封锁类的虚函数 封锁类不能有虚函数,因为密封类禁止继承,也就无法在子类中重写它的...

    华为HCNP-RS三科全套图文学习笔记【共3章64节】.rar

    25、引入路由1 35 26、引入路由2 36 27、默认路由 39 28、PBR 40 29、IGMP 42 30、PIM-DM 44 31、PIM-SM 44 二、华为HCDP IESN学习笔记 46 1、 VLAN 1 46 2、 VLAN 2 (Hybrid) 48 3、 VLAN 3 (Mux VLAN) 49 4、 ...

Global site tag (gtag.js) - Google Analytics