java完成文件的上传[欣赏]
java实现文件的上传
1、文件上传的核心点
1:用
来声明一个文件域。File:_____ <浏览>.
2:必须要使用post方式的
单。
3:必须设置表单的类型为multipart/form-data.是设置这个表单传递的不是key=value值。传递的是字节码.
对于一个普通的表单来说只要它是post类型。默认就是
Content-type:application/x-www-from-urlencoded
表现形式
1:在request的请求头中出现。
2:在form声明时设置一个类型enctype="application/x-www-form-urlencoded";
如果要实现文件上传,必须设置enctype=“multipart/form-data”
表单与请求的对应关系:
2、如何获取上传的文件的内容,以下是自己手工解析txt文档 package cn.itcast.servlet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /**
* 如果一个表单的类型是post且enctype为multipart/form-date
* 则所有数据都是以二进制的方式向服务器上传递。
* 所以req.getParameter("xxx")永远为null。
* 只可以通过req.getInputStream()来获取数据,获取正文的数据
*
* @author wangjianme
*
*/
public class UpServlet extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String txt = req.getParameter("txt");//返回的是null
System.err.println("txt is :"+txt);
System.err.println("=========================================");
InputStream in = req.getInputStream();
// byte[] b= new byte[1024];
// int len = 0;
// while((len=in.read(b))!=-1){
// String s = new String(b,0,len);
// System.err.print(s);
// }
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String firstLine = br.readLine();//读取第一行,且第一行是分隔符号
String fileName = br.readLine();
fileName = fileName.substring(fileName.lastIndexOf("\\")+1);// bafasd.txt"
fileName = fileName.substring(0,fileName.length()-1);
br.readLine();
br.readLine();
String data = null;
//获取当前项目的运行路径
String projectPath = getServletContext().getRealPath("/up");
PrintWriter out = new PrintWriter(projectPath+"/"+fileName);
while((data=br.readLine())!=null){
if(data.equals(firstLine+"--")){
break;
}
out.println(data);
}
out.close();
}
}
3、使用apache-fileupload处理文件上传
框架:是指将用户经常处理的业务进行一个代码封装。让用户可以方便的调用。
目前文件上传的(框架)组件:
Apache----fileupload -
Orialiy – COS – 2008() -
Jsp-smart-upload – 200M。
用fileupload上传文件:
需要导入第三方包:
Apache-fileupload.jar – 文件上传核心包。
Apache-commons-io.jar – 这个包是fileupload的依赖包。同时又是一个工具包。 核心类:
DiskFileItemFactory – 设置磁盘空间,保存临时文件。只是一个具类。
ServletFileUpload , 文件上传的核心类,此类接收request,并解析reqeust。
servletfileUpload.parseRequest(requdest) - List
一个FileItem就是一个标识的开始:---------243243242342 到 ------------------245243523452—就是一个FileItem
第一步:导入包
第二步:书写一个servlet完成doPost方法
/**
* DiskFileItemFactory构造的两个参数
* 第一个参数:sizeThreadHold - 设置缓存(内存)保存多少字节数据,默认为10K
* 如果一个文件没有大于10K,则直接使用内存直接保存成文件就可以了。
* 如果一个文件大于10K,就需要将文件先保存到临时目录中去。
* 第二个参数 File 是指临时目录位置
*
*/
public class Up2Servlet extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTf-8");
//获取项目的路径
String path = getServletContext().getRealPath("/up");
//第一步声明diskfileitemfactory工厂类,用于在指的磁盘上设置一个临时目录
DiskFileItemFactory disk =
new DiskFileItemFactory(1024*10,new File("d:/a"));
//第二步:声明ServletFileUpoload,接收上面的临时目录
ServletFileUpload up = new ServletFileUpload(disk);
//第三步:解析request
try {
List list = up.parseRequest(req);
//如果就一个文件
FileItem file = list.get(0);
//获取文件名,带路径
String fileName = file.getName();
fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
//获取文件的类型
String fileType = file.getContentType();
//获取文件的字节码
InputStream in = file.getInputStream();
//声明输出字节流
OutputStream out = new FileOutputStream(path+"/"+fileName);
//文件copy
byte[] b = new byte[1024];
int len = 0;
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
out.close();
long size = file.getInputStream().available();
//删除上传的临时文件
file.delete();
//显示数据
resp.setContentType("text/html;charset=UTf-8");
PrintWriter op = resp.getWriter();
op.print("文件上传成功
文件名:"+fileName);
op.print("
文件类型:"+fileType);
op.print("
文件大小(bytes)"+size);
} catch (Exception e) {
e.printStackTrace();
}
}
}
4、上传多个文件
第一步:修改页面的表单为多个input type=”file”
第二步:遍历list
public class Up3Servlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String path = getServletContext().getRealPath("/up");
//声明disk
DiskFileItemFactory disk = new DiskFileItemFactory();
disk.setSizeThreshold(1024*1024);
disk.setRepository(new File("d:/a"));
//声明解析requst的servlet
ServletFileUpload up = new ServletFileUpload(disk);
try{
//解析requst
List list = up.parseRequest(request);
//声明一个list