jsp Servlet 文件上传
- <%@ 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>
- <!-- 上传文件是上传到服务器上,而保存到数据库是文件名 -->
- <!-- 上传文件是以文件转换为二进制流的形式上传的 -->
- <!-- enctype="multipart/form-data"需要设置在form里面,否则无法提交文件 -->
- <form action="us" method="post" enctype="multipart/form-data">
- <table>
- <tr>
- <td></td>
- <td><h1>文件上传</h1></td>
- </tr>
- <tr>
- <td>上传文件:</td>
- <td><input type="file" name="file"/></td>
- </tr>
- <tr>
- <td><div align="center">任务等级:</div></td>
- <td><div align="center">
- <select name="p2" id="p2">
- <option value="1">1</option>
- <option value="2">2</option>
- <option value="3">3</option>
- </select>
- </div></td>
- </tr>
- <tr>
- <td><div align="center">播放次数:</div></td>
- <td><div align="center">
- <input type="text" name="p3" id="p3" height="25px"/>
- </div></td>
- </tr>
- <tr>
- <td><div align="center">终端ID:</div></td>
- <td><div align="center">
- <input type="text" name="p4" id="p4" height="25px"/>
- </div></td>
- </tr>
- <tr>
- <td></td>
- <td><input type="submit" value="上传文件"/></td>
- </tr>
- </table>
- </form>
- </body>
- </html>
- package com.cscy.servlet;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.List;
- import java.util.UUID;
- 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.FileUploadBase;
- import org.apache.commons.fileupload.ProgressListener;
- import org.apache.commons.fileupload.disk.DiskFileItemFactory;
- import org.apache.commons.fileupload.servlet.ServletFileUpload;
- import org.apache.log4j.Logger;
- import hy.com.port.BroadcastImpl;
- /**
- * @ClassName: UploadServlet
- *
- */
- public class uploadServlet extends HttpServlet {
- /**
- *
- */
- private static Logger logger = Logger.getLogger(SetServlet.class);
- private static final long serialVersionUID = 1L;
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- String[] a=new String[4];
- String[] b={""};
- int A1 = 0;
- int B1 = 0;
- long C1 = 0;
- //得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
- String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
- //上传时生成的临时文件保存目录
- String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
- File tmpFile = new File(tempPath);
- if (!tmpFile.exists()) {
- //创建临时目录
- tmpFile.mkdir();
- }
- //消息提示
- String message = "";
- try{
- //使用Apache文件上传组件处理文件上传步骤:
- //1、创建一个DiskFileItemFactory工厂
- DiskFileItemFactory factory = new DiskFileItemFactory();
- //设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。
- factory.setSizeThreshold(1024*5000);//设置缓冲区的大小为5000KB,如果不指定,那么缓冲区的大小默认是10KB
- //设置上传时生成的临时文件的保存目录
- factory.setRepository(tmpFile);
- //2、创建一个文件上传解析器
- ServletFileUpload upload = new ServletFileUpload(factory);
- //监听文件上传进度
- upload.setProgressListener(new ProgressListener(){
- public void update(long pBytesRead, long pContentLength, int arg2) {
- System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);
- /**
- * 文件大小为:14608,当前已处理:4096
- 文件大小为:14608,当前已处理:7367
- 文件大小为:14608,当前已处理:11419
- 文件大小为:14608,当前已处理:14608
- */
- }
- });
- //解决上传文件名的中文乱码
- upload.setHeaderEncoding("UTF-8");
- //3、判断提交上来的数据是否是上传表单的数据
- if(!ServletFileUpload.isMultipartContent(request)){
- //按照传统方式获取数据
- return;
- }
- //设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MB
- upload.setFileSizeMax(1024*1024*100);
- //设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MB
- upload.setSizeMax(1024*1024*10);
- //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
- List<FileItem> list = upload.parseRequest(request);
- int i=0;
- for(FileItem item : list){
- //如果fileitem中封装的是普通输入项的数据
- if(item.isFormField()){
- String name = item.getFieldName();
- //解决普通输入项的数据的中文乱码问题
- String value=item.getString("UTF-8");
- a[i]=value;
- //value = new String(value.getBytes("iso8859-1"),"UTF-8");
- System.out.println(name + "="+value);
- i++;
- }else{//如果fileitem中封装的是上传文件
- //得到上传的文件名称,
- String filename = item.getName();
- System.out.println(filename);
- //上传的文件都是保存在/WEB-INF/upload目录下的子目录当中
- String fileSaveRootPath=this.getServletContext().getRealPath("/WEB-INF/upload");
- //通过文件名找出文件的所在目录
- String path = findFileSavePathByFileName(filename,fileSaveRootPath);
- File file = new File(path + "\\" + filename);//目录
- b[0]=(path + "\\" + filename);
- System.out.println(file);
- if(filename==null || filename.trim().equals("")){
- continue;
- }
- //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
- //处理获取到的上传文件的文件名的路径部分,只保留文件名部分
- filename = filename.substring(filename.lastIndexOf("\\")+1);
- //得到上传文件的扩展名
- String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
- //如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
- System.out.println("上传的文件的扩展名是:"+fileExtName);
- //获取item中的上传文件的输入流
- InputStream in = item.getInputStream();
- //得到文件保存的名称
- String saveFilename = filename;
- //得到文件的保存目录
- String realSavePath = makePath(saveFilename, savePath);
- //创建一个文件输出流
- FileOutputStream out = new FileOutputStream(realSavePath + "\\" + saveFilename);
- //创建一个缓冲区
- byte buffer[] = new byte[1024];
- //判断输入流中的数据是否已经读完的标识
- int len = 0;
- //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
- while((len=in.read(buffer))>0){
- //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
- out.write(buffer, 0, len);
- }
- //关闭输入流
- in.close();
- //关闭输出流
- out.close();
- //删除处理文件上传时生成的临时文件
- item.delete();
- message = "文件上传成功!";
- }
- }
- String A=a[0]; String B=a[1]; String C=a[2];
- A1=Integer.parseInt(A);
- B1=Integer.parseInt(B);
- C1=Long.parseLong(C);
- System.out.println(A1+"\t"+B1+"\t"+C1);
- }catch (FileUploadBase.FileSizeLimitExceededException e) {
- e.printStackTrace();
- request.setAttribute("message", "单个文件超出最大值!!!");
- request.getRequestDispatcher("/message.jsp").forward(request, response);
- return;
- }catch (FileUploadBase.SizeLimitExceededException e) {
- e.printStackTrace();
- request.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!");
- request.getRequestDispatcher("/message.jsp").forward(request, response);
- return;
- }catch (Exception e) {
- message= "文件上传失败!";
- e.printStackTrace();
- }
- BroadcastImpl.createBroadcastTask(b, A1, B1, C1);
- logger.info("任务创建成功!");
- request.setAttribute("message",message);
- request.getRequestDispatcher("/message.jsp").forward(request, response);
- }
- public String findFileSavePathByFileName(String filename,String saveRootPath){
- int hashcode = filename.hashCode();
- int dir1 = hashcode&0xf; //0--15
- int dir2 = (hashcode&0xf0)>>4; //0-15
- String dir = saveRootPath + "\\" + dir1 + "\\" + dir2; //upload\2\3 upload\3\5
- File file = new File(dir);
- if(!file.exists()){
- //创建目录
- file.mkdirs();
- }
- return dir;
- }
- /**
- * @Method: makeFileName
- * @Description: 生成上传文件的文件名,文件名以:uuid+"_"+文件的原始名称
- * @Anthor:
- * @param filename 文件的原始名称
- * @return uuid+"_"+文件的原始名称
- */
- // private String makeFileName(String filename){ //2.jpg
- // //为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
- // return UUID.randomUUID().toString() + "_" + filename;
- // }
- /**
- * 为防止一个目录下面出现太多文件,要使用hash算法打散存储
- * @Method: makePath
- * @Description:
- * @Anthor:
- *
- * @param filename 文件名,要根据文件名生成存储目录
- * @param savePath 文件存储路径
- * @return 新的存储目录
- */
- private String makePath(String filename,String savePath){
- //得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
- int hashcode = filename.hashCode();
- int dir1 = hashcode&0xf; //0--15
- int dir2 = (hashcode&0xf0)>>4; //0-15
- //构造新的保存目录
- String dir = savePath + "\\" + dir1 + "\\" + dir2; //upload\2\3 upload\3\5
- //File既可以代表文件也可以代表目录
- File file = new File(dir);
- //如果目录不存在
- if(!file.exists()){
- //创建目录
- file.mkdirs();
- }
- return dir;
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
jsp Servlet 文件上传的更多相关文章
- jsp,servlet文件上传问题完善
1. 上传文件时文件名中文乱码 upload.setHeaderEncoding("utf-8"); 有个疑惑: 不管设置不设置都不乱码,但是刘帅龙老师讲的时候出现了乱码 . 2. ...
- Servlet文件上传下载
今天我们来学习Servlet文件上传下载 Servlet文件上传主要是使用了ServletInputStream读取流的方法,其读取方法与普通的文件流相同. 一.文件上传相关原理 第一步,构建一个up ...
- ServletFileUpload(Servlet文件上传)
//**文件上传** form表单提交必须指定Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型"multipart/form-data" //1.创建磁盘文件项目工 ...
- java web学习总结(二十四) -------------------Servlet文件上传和下载的实现
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- JSP多文件上传到服务器
问题描述: 作为一个Java开发Web方向的程序员,很重要的一个功能,就是上传文件功能是一定要掌握的,今天整理了一下代码. 1.JSP显示界面代码和动态添加上传文件个数. <%@ page la ...
- Android+jsp +html 文件上传案例 已测试 成功通过
我文件上传一直是广大读者一个问题 今天就把成功案例写下 javaweb 网页前段 <%@ page language="java" import="java.uti ...
- jsp简易文件上传(common.fileupload)
昨天开始重新架构我的V&View(维视),之前写文章使用的是一个kindediter的插件,挺好用的.最近不知道咋了,出现了些小问题.早在写V&View的时候就想用以下两种方法实现文章 ...
- JSP+Servlet实现上传下载
0.项目结构 1.在WebRoot下创建index.jsp页面 <%@ page language="java" import="java.util.*" ...
- jsp实现文件上传下载
文件上传: upload.jsp <form action="uploadServlet" method="post" enctype="mul ...
随机推荐
- supervisor 文档
supervisor 是用 Python 开发的一个 C/S 服务.是 Linux/Unix 系统下的进程管理工具.它可以很方便的监听.启动.停止.重启一个或多个进程.用Supervisor管理的进程 ...
- Http长连接
1.Http长连接 Http的请求时在TCP连接上进行发送的,TCP的连接分为长连接和短连接 打开www.baidu.com,查看Connection ID 如下图. Connection ID代表T ...
- 基于javaMail的邮件发送--excel作为附件
基于JavaMail的Java邮件发送 Author xiuhong.chen@hand-china.com Desc 简单邮件发送 Date 2017/12/8 项目中需要根据物料资质的状况实时给用 ...
- 本文讲述下windows下使用rsync备份数据
本文讲述下windows下使用rsync备份数据 需要使用的软件如下: 环境需求: 上海monitor上跑有定时任务计划备份线上数据库,现在需要把上海monitor上的备份数据拉回到179.12数据回 ...
- windows 命令相关
脚本执行后的返回值:echo %errorlevel%
- 在ubuntu下装python3.6
Ubuntu 14.04 and 16.04 If you are using Ubuntu 14.04 or 16.04, you can use J Fernyhough's PPA at htt ...
- Mysql-12条优化技巧
应用程序慢如牛,原因多多,可能是网络的原因.可能是系统架构的原因,还有可能是数据库的原因. 那么如何提高数据库SQL语句执行速度呢?有人会说性能调优是数据库管理员(DBA)的事,然而性能调优跟程序员们 ...
- 正则表达式与Python中re模块的使用
正则表达式与Python中re模块的使用 最近做了点爬虫,正则表达式使用的非常多,用Python做的话会用到re模块. 本文总结一下正则表达式与re模块的基础与使用. 另外,给大家介绍一个在线测试正则 ...
- Immutable 学习
1.什么是Immutable Data? Immutable Data 就是一旦创建,就不能再被更改的数据.对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对 ...
- SQL对于 小数处理的小结
DECLARE @digital INT --截断小数位 ,,)),@digital) AS 截断小数位 --上抛小数位 ,,)),@digital) AS 上抛小数位 SELECT CEILING ...