upload三种上传方式(上)---Servlet---post---commons-fileupload.1.2.1.jar方式请求上传文件
上传前进行的配置选项:
1、在下方的Servers中,右键你的tomcat--open,选中下面两个配置。
第一个:Serve modules without publishing
作用:tomcat默认时,会将你的项目拷贝至tomcat中的Server path目录下进行部署运行,当选中该配置后,则会使用你的项目位置部署运行。
(补充:在上方Server Locations配置中,我选中的是第二个,所以会在K:\apache-tomcat-8.0.37-windows-x64\apache-tomcat-8.0.37\wtpwebapps\mystudy\..进行部署运行,如果是选中默认第一个,则会拷贝该项目在tomcat中的.metadada目录中复制一个并进行部署运行)
例如:未勾选时,我的tomcat的默认部署路径为K:\apache-tomcat-8.0.37-windows-x64\apache-tomcat-8.0.37\wtpwebapps\mystudy\..,勾选后,我的tomcat的部署路径为K:\shxtsx\xmgc\mystudy\..
(补充:tomcat自带重新部署的功能,即reloadable=true,如果reloadable=false,只是在项目修改后不会自动重新部署,但是resatrt或者关闭eclipse,再重新打开,它还是会重新部署,因此,当上传的文件放在tomcat的目录路径下时,无论怎样都会消失,所以最好的方式是将上传的文件存放到项目目录下)
-----------------------------------------------------------------------------------------------------------------
第二个:Publish module contexts to separate XML files
作用:将你的Server下面的server.xml中的<context>属性分离出来,在你的tomcat->conf->Catalina->localhost中生成一个与你项目对应的xml文件(补充:其名称与你项目的发布根路径名称相同,即<context path="">中path属性的值)
在低版本的tomcat(补充:我从7.0开始用的,所以很少见到)中,如果不勾选该配置,则会出现红色的警告[警告: [SetPropertiesRule] Setting property 'source' to 'org.eclipse.jst.jee.server:TestTomcat6.0.16' did not find a matching property. ],同时,对于项目的管理也更加的方便。
-----------------------------------------------------------------------------------------------------------------
2、上传所使用的包
Commons-fileupload-xx.jar
Commons-io-xx.jar
网盘链接:http://pan.baidu.com/s/1i5EK9Sh
密码:br2e
(补充:我用的是1.2.1版本)
一、传统Servlet---post请求上传方式,使用的是DiskFileItemFactory和ServletFileUpload
Servlet代码:(全部是org.apache.commons.fileupload.**下面的)
package com.yong.upload; 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.annotation.WebServlet;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload; /**
* Servlet implementation class FileUpload
*/
@WebServlet("/FileUpload")
public class FileUpload extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//硬盘文件项工厂--把IO流转换成临时文件
DiskFileItemFactory factory = new DiskFileItemFactory();
//servlet文件上传
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> list = upload.parseRequest(request);
if(list.size()>0){ //获取流字符串
String message = list.get(0).getString("UTF-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().print(message); //由于每次上传只能上传一个文件,因此直接在list中get(0)就能获得上传的该文件。
FileItem item = list.get(1);
//获取文件后缀名
String fileExtraName = item.getName().substring(item.getName().lastIndexOf("."));
//生成新的文件名
String newFileName = UUID.randomUUID().toString()+fileExtraName; //上传路径
String path = request.getRealPath("file");
System.out.println(path); //生成文件
File file = new File(path,newFileName); InputStream ins = item.getInputStream();
FileOutputStream fos = new FileOutputStream(file);
byte[] b = new byte[1024];
while(true){
int n = ins.read(b);
if(n == -1){
break;
}
//写入服务器
fos.write(b,0,n);
}
ins.close();
fos.close();
}
} catch (FileUploadException e) {
e.printStackTrace();
System.out.println("上传失败!");
}
}
}
jsp页面代码:
<form action="FileUpload" method="post" enctype="multipart/form-data">
<input type="text" name="message">
<input type="file" name="file" id="file" value="aaa">
<button type="submit">注册</button>
</form>
操作流程总结:
第一步:配置环境
(1)勾选两个配置信息
(2)引入 commons-fileupload-1.2.1.jar 和 commons-io-1.2.1.jar 两个jar包
第二步:编写jsp文件
(1)注意在input中加入“enctype='multipart/form-data'”属性
(2)method='post' 使用post请求
第三步:编写servlet.java
(1)创建servlet.java命名为FileUploadServlet.java
创建 DiskFileItemFactory factory = new DiskFileItemFactory();
创建 ServletFileUpload upload = new ServletFileUpload(factory);
使用upload解析reqeust请求传过来的数据 upload.parseRequest(request);类型为list
如果你的<input type='file'>是第一个,则使用list.get(0)来获取,结果为FileItem类型
最后以流的形式读数据后再写入磁盘中,大功告成。
upload三种上传方式(上)---Servlet---post---commons-fileupload.1.2.1.jar方式请求上传文件的更多相关文章
- JSP 文件上传下载系列之二[Commons fileUpload]
前言 关于JSP 文件上传的基础和原理在系列一中有介绍到. 这里介绍一个很流行的组件commons fileupload,用来加速文件上传的开发. 官方的介绍是: 让添加强壮,高性能的文件到你的se ...
- js或css文件合并的三种方式推荐
源文档 <http://www.jb51.net/article/32834.htm> 在Web项目的开发中,js,css文件会随着项目的开发变得越来越多,越来越大,这就给给性能方面带来一 ...
- 前端js文件合并三种方式
最近在思考前端js文件该如何合并,当然不包括不能合并文件,而是我们能合并的文件,想了想应该也只有三种方式. 三个方式如下: 1. 一个大文件,所有js合并成一个大文件,所有页面都引用它. 2. 各个页 ...
- 前端js,css文件合并三种方式,bat命令
前端js,css文件合并三种方式,bat命令 前端js文件该如何合并三个方式如下:1. 一个大文件,所有js合并成一个大文件,所有页面都引用它.2. 各个页面大文件,各自页面合并生成自己所需js的大文 ...
- 详解三种java实现多线程的方式
java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- struts2的action访问servlet API的三种方法
学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object g ...
- RocketMQ(6)---发送普通消息(三种方式)
发送普通消息(三种方式) RocketMQ 发送普通消息有三种实现方式:可靠同步发送.可靠异步发送.单向(Oneway)发送. 注意 :顺序消息只支持可靠同步发送. GitHub地址: https:/ ...
- epoll函数及三种I/O复用函数的对比
epoll函数 #include <sys/epoll.h>int epoll_create(int size)int epoll_ctl(int epfd, int op, int fd ...
- ASP.Net 中的三种控件
---恢复内容开始--- 第一种:HTML控件 ASP.Net把HTML控件当成普通字符串渲染到浏览器端,不去检查正确性.无法在服务器端进行处理. 比如: <input111 type=&quo ...
随机推荐
- webbug3.0靶场第二关
由于是新手,当看见一个图片后一脸蒙比,查了一下才知道这原来叫做隐写术 看人家说破解图片隐写术用Stegsolve非常好用,然后查了一下kali软件仓库并没有找到Steegsolve这个软件,只能另想他 ...
- 《构建之法》chapter5,6 读书心得
<构建之法>第五章用体育运动等团队例子引出软件开发团队的形式,用更加生活化.形象化的例子让读者更能理解软件开发团队的形式.软件团队形式多样,适用于不同的人员与需求.团队可能会演变的模式有: ...
- 项目工程中的WebRoot与WebContent有什么区别?
[1] 在MyEclipse中创建web项目后,web程序的根目录文件夹是WebRoot,而创建dynam web project时候,web程序的根 目录文件夹是WebContent,他们之间没有本 ...
- 2018.5.3 maven
1 maven基本概念 1.1maven是什么 1)软件项目管理和理解工具 2)项目对象模型(Project Object Model,POM) 3)项目的构建.报告和文档的 ...
- Lambda表达式中的GroupBy使用的正确姿势
本实例适用于:将记录中的数据进行分组得到一个一对多模型数据Model 案例中的Model 注:UserDetailes 包含User的信息和其所属部门信息 需求:将UserDetailes 的记录分组 ...
- IDT表连接
一.table A为基础表,左外连接table B,若要限制B的条件,需加(+),否则会对结果集以B表的条件进行过滤. DWD_REASON_CODE.CODE(+)=DWR_EDA_CL_TST_D ...
- Jquery的动态切换图片
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 常识判断-科技-day123
PS: 在常识中科技是最难的 PS: 20-2w HZ是人能听到的频率 PS: 物体的熔点和凝固点是一致的 PS: 氮肥如果多了,可能只是长叶子不结果: 磷肥促进开花结果 PS; 病毒是介于生物和非 ...
- PRESTO安装部署和参数说明(一)
PRESTO部署和参数说明(一) 一,概要 在部署和使用presto的过程中,在此记录一下部署记录和使用记录以及需要注意的事项.本人使用的presto版本是0.214,3台redhat虚拟机.使用背景 ...
- 2、Linux安装jmeter
1.下载地址 http://jmeter.apache.org/download_jmeter.cgi 2.选择下载,本地选择,Source版会比较坑 3.安装jdk8,过程省略,可参考:https: ...