一、html页面
二、servlet处理
package com.lyd.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Iterator;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
public class UploadServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码的格式
resp.setContentType("text/html;charset=UTF-8");
//获取页面传进来的参数
/*String name = req.getParameter("name");
String age = req.getParameter("age");
String file = req.getParameter("file");
//设置了编码过滤器则可以不要下面的设置
//注意此处
//name=new String(name.getBytes("ISO8859-1"),"UTF-8");
//file=new String(file.getBytes("ISO8859-1"),"UTF-8");
resp.getWriter().println("name:"+name+"<br>age:"+age+"<br>file:"+file);
*/
//文件的上传与下载,都会以流的形式进行,所以需要写一个方法进行流的处理
//proStream(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码的格式
req.setCharacterEncoding("UTF-8");
//只能在请求中调用
proStream(req,resp);
}
//采用apach组建获取文件方法
private void proStream(HttpServletRequest req, HttpServletResponse resp) throws IOException, IllegalStateException, ServletException {
//设置响应对象的编码
resp.setContentType("text/html;charset=UTF-8");
/*//创建流通道
ServletInputStream is=req.getInputStream();
//定义一个字节数组
byte[] arr=new byte[1024];
//定义一个标签接收值
int flag=0;
//循环读取数据
while((flag=is.readLine(arr, 0, 1024))!=-1) {
//将读取的字节转换为字符串,通过字符串提供的构造方法(读取的字节数组,从0下标开始,读取的字节数为止)
String line=new String(arr,0,flag);
//通过响应对象读取的字符串显示在页面上
resp.getWriter().write(line+"<br>");
}
//关闭流通到
is.close();*/
//第二种方法
//获取参数
String name = req.getParameter("name");
String age = req.getParameter("age");
//显示在页面上
resp.getWriter().write("<strong>name:"+name+"<br>age:"+age+"</strong>");
Part part = req.getPart("file");
// String filename = part.getName();
// resp.getWriter().write("<br/>filename:"+filename);
// System.out.println(filename);
//得到文件的名称,重新定义一个方法
/*String fileName=getFileName(part);
resp.getWriter().write("<br/>fileName:"+fileName+"<br/>");
//获取文件的内容
//创建流通道
InputStream is=part.getInputStream();
//定义一个字节数组
byte[] arr=new byte[1024];
//定义一个标签接收值
int flag=0;
//循环读取数据
while((flag=is.read(arr, 0, 1024))!=-1) {
//将读取的字节转换为字符串,通过字符串提供的构造方法(读取的字节数组,从0下标开始,读取的字节数为止)
String line=new String(arr,0,flag);
//通过响应对象读取的字符串显示在页面上
resp.getWriter().write(line+"<br/>");
}
//关闭流通到
is.close();*/
//将上传的文件保存在服务器中
//定义一个新的方法进行数据处理
saveUpload(part);
//做一个文件上传的提示
resp.getWriter().write("<strong>文件上传成功</strong");
}
//定义一个方法用来获取文件的名称
private String getFileName(Part part) {
//测试部分,得到头的信息,从而获得文件名
// Iterator<String> it = part.getHeaderNames().iterator();
// while(it.hasNext()) {
// String name = it.next();
// //根据名字得到头的名称,是键值对的形式
// System.out.println(name+":"+part.getHeader(name));
// }
//根据上面的测试,获取文件信息部分
String header = part.getHeader("content-disposition");
//分割和获取文件的信息
String[] str=header.split("filename=");
//把字符串数组转换为数组的字符串,用于显示的测试
//System.out.println(Arrays.toString(str));
//获取信息
//System.out.println(str[str.length-1].replace("\"", ""));
return str[str.length-1].replace("\"", "");
}
/**
* 获取上传文件的名称
* 获取应用程序的真实路径
* 创建文件夹进行数据的保存,此处需要判断
* @param part
*/
//保存文件在服务器的方法
private void saveUpload(Part part) {
//获取上传文件的名称
String fileName = getFileName(part);
//文件名相同,文件内容不同解决方法(定义不同的文件名)
//System.nanoTime()系统的数,或者加一个uuid修饰
fileName="lyd_"+System.nanoTime()+"_"+fileName;
//获取应用程序的真实路径,用代码进行实现
//首先获取Servlet上下文路径的对象
ServletContext sc = getServletContext();
String realPath = sc.getRealPath("File.separator");
//String realPath = sc.getRealPath("/");
System.out.println(realPath);
//创建保存路径,保存路径在upload下面
File file=new File(realPath+"upload");
//如果文件不存在,需要提前进行创建
if(!file.exists()) {
//创建文件
file.mkdirs();
}
//构建新的保存文件(文件路径,文件名)
File upFile=new File(file,fileName);
//得到文件的输入流
InputStream fis=null;
byte[] arr=new byte[1024];
int flag=0;
//得到文件的输出流
FileOutputStream fos=null;
try {
fos=new FileOutputStream(upFile);
fis=part.getInputStream();
while((flag=fis.read(arr, 0, 1024))!=-1) {
//将读取的字节写入指定的文件中
fos.write(arr, 0, flag);
}
}catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally {
//先关闭输出流
if(fos!=null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//再关闭输出流
if(fis!=null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}