Java学习日记6:文件上传
来源:互联网 发布:淘宝店铺托管安全吗 编辑:程序博客网 时间:2024/06/03 11:49
今天学的是文件的上传(从客户端传到服务器)
Http文件上传客户端要求(在html中要注意的事情):
1、用表单提交数据
<from></form>
2、请求方法必须为post
<form method="post">
3、以二进制流提交数据给服务器(改变enctype的值)
<form enctype="multipart/form-data" action="UploadFile" method=post >...</form>//enctype默认值为application/x-www-form-urlencoded,不会提交文件内容,只会提交文件名。enctype值设为multipart/form-data时,才能提交文件内容给服务器。
在服务器端:
Servlet3.0 文件上传支持: HttpServletRequest
增加了对文件上传的支持。 HttpServletRequest
提供了如下两个方法来处理文件上传。 Part getPart(String name)
:根据名称来获取文件上传域。 Collection<Part> getParts()
:获取所有的文件上传域。
每个Part对象封装一个文件上传域,该对象提供了大量方法来访问上传文件的文件类型、大小、输入流等,并提供了一个write(String file)//这里的file是"(要写的文件所在的绝对路径)+(新文件名)"
方法将上传文件写入服务器磁盘。
- 注意:必须在接受上传Servlet上增加@MultipartConfig配置
这里有一个简单的实现文件上传的Servlet:
index页面:
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>文件上传</title></head><body><h1>文件上传</h1><center> <form action="upload" enctype="multipart/form-data" method="post"> 文件:<input type="file" name="pic"/><br/> 描述:<input type="text" name="dis"/><br/> <input type="submit" value="Upload"/><br/> </form></center></body></html>
Servlet:
package com.oracle;import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.text.SimpleDateFormat;import java.util.Collection;import java.util.Date;import java.util.Iterator;import java.util.Random;import java.util.regex.Matcher;import java.util.regex.Pattern;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.Part;import com.upload.UploadUtils;@MultipartConfig@WebServlet("/upload")public class UploadServlet01 extends HttpServlet{ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); PrintWriter out=resp.getWriter(); ServletContext sc=this.getServletContext(); Part part=req.getPart("pic");//根据表单项的名字得到Part对象 if(null!=part) { String contentType=part.getContentType();//得到文件类型 long size=part.getSize();//得到文件大小 Collection<String> allheader= part.getHeaderNames();//得到所有报头名 Iterator<String> it=allheader.iterator();//迭代器 out.println("<h1>contentType:"+contentType+"</h1>"); out.println("<h1>size:"+size+"</h1>"); out.println("<h1>表单项的name:"+part.getName()+"</h1><ul>"); out.println("<h1>文件描述:"+req.getParameter("dis")+"</h1>"); while(it.hasNext())//迭代出所有报头和其所对应的值 { String header=it.next(); String value=part.getHeader(header); out.println("<li>"+header+":"+value+"</li>"); } String newname=sc.getRealPath("ups")+File.separator+randFileName()+this.getExtName(this.getFileName(part));//新的路径+文件名 part.write(newname);//将文件写入服务器 // part.delete(); out.println("</ul>"); out.println("<h1>服务器数据表存:原文件名:"+this.getFileName(part)+" 新文件名:"+newname+" MIME类型:"+part.getContentType()+"</h1>"); } // out.close(); } private SimpleDateFormat sf=new SimpleDateFormat("yyyyMMddHHmmsssss"); private Random random=new Random(); public String randFileName()//根据时间写一个文件名,精确到毫秒,再加一个随机数 { return sf.format(new Date())+"_"+random.nextInt(1000); } public String getExtName(String fname)//得到文件的扩展名(不包括原文件名) { String ex=""; int index=fname.lastIndexOf("."); if(index!=-1) { ex=fname.substring(index); } return ex; } public String getFileName(Part part)//得到原文件名 { String fname=""; String hvalue=part.getHeader("Content-Disposition"); //form-data; name="pic"; filename="hello.txt" Pattern pattern=Pattern.compile("(form-data; name=\"(.*?)\"; filename=\"(.*?)\")"); Matcher mach=pattern.matcher(hvalue); if(mach.find()) { fname=mach.group(3); } return fname; }}
今天就先到这吧~
0 0
- Java学习日记6:文件上传
- PHP学习日记-上传文件
- Java学习日记7:文件上传和下载
- JSP学习日记(二) 文件上传
- Spring学习日记(三) 上传文件
- Java学习日记8:文件上传工具类的实现和服务器给客户端发送图片
- Java菜鸟学习日记6
- java学习日记_91:IO流之File文件操作
- Java学习日记1——多线程拷贝文件
- java菜鸟学习日记2 class文件检验器
- 关于java文件上传的学习
- Jsp学习6-文件上传
- Java学习日记(6)--多线程
- 我的java学习日记(6)
- JAVA 学习日记(6).JSTL和EL
- Java和Scala学习日记6
- java学习日记(线程)
- java学习日记
- 贪心算法-数列极差问题(对前篇文章的修改)
- 类与类之间的几种关系
- 测试golang中的多核多线程
- 当spring 容器初始化完成后执行某个方法
- Picasso的用法
- Java学习日记6:文件上传
- SQL教程重温之group by&having
- 一篇较为详细的 Storyboard使用方法 总结
- Web初学-入门和tomcat介绍记录
- Storm学习00---Storm的设计思想
- Android日常积累
- 牛顿法与梯度下降法
- 中科院计算所培训中心2017年第二季度课程安排
- 用opencv svm 折腾的识别程序