前言:
- 学习技术是一个苦乐皆有的过程,目标对于学习而言是不可缺少的,一旦没有了目标,就会丧失向前的动力
文件的上传
1.上传文件到磁盘
<body>
<form action="UploadServlet" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
<input type="file" value="选择文件" name="file"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
- enctype属性
- multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。
- 需要注意的是:默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据。
- application/x-www-form-urlencoded不是不能上传文件,是只能上传文本格式的文件,multipart/form-data是将文件以二进制的形式上传,这样可以实现多种类型的文件上传。
- 扩展资料
-
一、关于HTML 标签的 enctype 属性
-
application/x-www-form-urlencoded:在发送前编码所有字符(默认)
-
multipart/form-data: 不对字符编码,或在使用包含文件上传控件的表单时,必须使用该值。
-
text/plain:空格转换为 “+” 加号,但不对特殊字符编码。
-
-
二、enctype:规定了form表单在发送到服务器时候编码方式,有如下的三个值。
-
1、application/x-www-form-urlencoded。默认的编码方式。但是在用文本的传输和MP3等大型文件的时候,使用这种编码就显得 效率低下。
-
2、multipart/form-data 。 指定传输数据为二进制类型,比如图片、mp3、文件。
-
3、text/plain。纯文体的传输。空格转换为 “+” 加号,但不对特殊字符编码。
-
//1.创建一个磁盘工厂对象
DiskFileItemFactory factory = new DiskFileItemFactory();
//2.通过工厂对象创建上传对象
ServletFileUpload fUpload = new ServletFileUpload(factory);
//3.通过上传对象解析前端发送的复合型表单数据
List<FileItem> list = null;
try {
list = fUpload.parseRequest(request);
for (FileItem fItem:list) {
//System.out.println(fItem);
if(!fItem.isFormField()){
//4.获取输入流
InputStream is = fItem.getInputStream();
//5.创建输出流--getName()获取的是文件名
FileOutputStream fos = new FileOutputStream("e:\\File\\" + fItem.getName());
byte[] b = new byte[1024];
int len;
while((len=is.read(b)) != -1){
fos.write(b,0,len);
}
fos.close();
is.close();
}
}
} catch (FileUploadException | IOException e) {
e.printStackTrace();
}
2.上传文件到服务器
//1.创建一个磁盘工厂对象
DiskFileItemFactory factory = new DiskFileItemFactory();
//2.通过工厂对象创建上传对象
ServletFileUpload fUpload = new ServletFileUpload(factory);
//3.通过上传对象解析前端发送的复合型表单数据
List<FileItem> list = null;
try {
list = fUpload.parseRequest(request);
for (FileItem fItem:list) {
//System.out.println(fItem);
//判断是否非文本信息
if(!fItem.isFormField()){
//E:\tools\apache-tomcat-7.0.57\webapps\Day41_Upload_Download\Upload
//4.通过全局对象获取绝对路径
String path = getServletContext().getRealPath("Upload");
//判断路径是否存在,不存在则创建
File file = new File(path);
if(!file.exists()){
file.mkdirs();
}
//输出路径拼接文件名
File newFile = new File(file, fItem.getName());
IOUtils.copy(fItem.getInputStream(),new FileOutputStream(newFile));
}
}
} catch (FileUploadException | IOException e) {
e.printStackTrace();
}
3.解决重名问题
- 使用UUID来生成唯一ID
//创建一个磁盘工厂
DiskFileItemFactory dff = new DiskFileItemFactory();
//通过工厂对象创建一个上传对象
ServletFileUpload sfu = new ServletFileUpload(dff);
//通过上传对象解析前端发送的复合型表单数据
try {
List<FileItem> list = sfu.parseRequest(request);
for (FileItem fileItem : list) {
if (!fileItem.isFormField()) {
//创建UUID来生成唯一的ID值
UUID uuid = UUID.randomUUID();
//获取全局变量
String upload = getServletContext().getRealPath("Upload");
File file = new File(upload);
if (!file.exists()) {
file.mkdirs();
}
File file1 = new File(upload, uuid.toString()+"_"+fileItem.getName());
IOUtils.copy(fileItem.getInputStream(), new FileOutputStream(file1));
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
- 使用时间来生成目录
//创建一个磁盘工厂
DiskFileItemFactory dff = new DiskFileItemFactory();
//通过工厂对象创建一个上传对象
ServletFileUpload sfu = new ServletFileUpload(dff);
//通过上传对象解析前端发送的复合型表单数据
try {
List<FileItem> list = sfu.parseRequest(request);
for (FileItem fileItem : list) {
if (!fileItem.isFormField()) {
//使用时间来创建唯一ID
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/HH/mm/ss");
String time = sdf.format(date);
String upload = getServletContext().getRealPath("Upload");
//upload--E:\tools\apache-tomcat-7.0.57\webapps\Day41_Upload_Download\Upload
//time--2019/2/25/14/56
File file = new File(upload, time);
if(!file.exists()){
file.mkdirs();
}
File file1 = new File(file, fileItem.getName());
IOUtils.copy(fileItem.getInputStream(),new FileOutputStream(file1));
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
- 使用提示用户重名来解决重名问题–>不推荐使用
if(fileItem.getName().equals("") || fileItem.getName().equals(null)){
request.setAttribute("msg","请选择图片");
request.getRequestDispatcher("Register.jsp").forward(request,response);
}else{
String upload = getServletContext().getRealPath("Upload");
File file = new File(upload, fileItem.getName());
if(file.exists()){
request.setAttribute("msg","图片重名请重新命名");
request.getRequestDispatcher("Register.jsp").forward(request,response);
}else{
new File(upload).mkdirs();
IOUtils.copy(fileItem.getInputStream(),new FileOutputStream(file));
}
}
4.存储完整的表单信息并展示图片
//1.创建一个磁盘工厂对象
DiskFileItemFactory factory = new DiskFileItemFactory();
//2.通过工厂对象创建上传对象
ServletFileUpload fUpload = new ServletFileUpload(factory);
//3.通过上传对象解析前端发送的复合型表单数据
List<FileItem> list = null;
HashMap<String, String> map = new HashMap<>();
Student student = new Student();
try {
//通过上传对象解析请求中的数据,获得集合
list = fUpload.parseRequest(request);
for (FileItem fItem:list) {
//判断是否非文本信息
if(!fItem.isFormField()){
//2.修改上传图片的名字
//使用UUID--生成唯一的ID值---wehfiw123%@#$!6fwef_f.jpg
UUID uuid = UUID.randomUUID();
System.out.println(uuid.toString());
String path = getServletContext().getRealPath("Upload");
File file = new File(path);
if(!file.exists()){
file.mkdirs();
}
//拼接路径和图片名字(uuid生成的随机字符串拼接上图片名字)
File file1 = new File(file, uuid.toString() + "_" + fItem.getName());
IOUtils.copy(fItem.getInputStream(),new FileOutputStream(file1));
//存储的路径不能为绝对路径
//把图片路径字符串写进ImgUrl中 student.setImgUrl("Upload/"+uuid.toString() + "_" + fItem.getName());
}else{
//通过key(getFieldNmae--表单的name属性值)获取value(getString--表单的value值)
String value = map.get(fItem.getFieldName());
//第一次存储
if(value == null){
map.put(fItem.getFieldName(),fItem.getString());
}else{//多次存储(多选框)
map.put(fItem.getFieldName(),value+","+fItem.getString());
}
}
}
//把map集合的数据存放到student对象中
BeanUtils.populate(student,map);
request.setAttribute("stu",student);
request.getRequestDispatcher("show.jsp").forward(request,response);
} catch (FileUploadException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (ServletException e) {
e.printStackTrace();
}
}
文件下载
<body>
<a href="Upload/a.jpg">下载</a><br/>
<a href="DownloadServlet?path=Upload/a.jpg">下载</a>
</body>
//Upload/a.jpg
String path = request.getParameter("path");
//获取文件名
String fileName = path.substring(path.lastIndexOf("/")+1);
//转码
fileName = URLEncoder.encode(fileName, "utf-8");
//设置下载响应头
response.setHeader("Content-disposition","attachment;fileName="+fileName);
//获取下载图片的绝对路径
path = getServletContext().getRealPath(path);
FileInputStream fis = new FileInputStream(path);
ServletOutputStream os = response.getOutputStream();
IOUtils.copy(fis,os);
os.close();
fis.close();
}
希望能够帮助到您