一、文件的上传:
@WebServlet(name = "UpLoadFileServlet")
public class UpLoadFileServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//用输入流输入到控制台打印出来
try {
ServletInputStream inputStream = request.getInputStream();
byte[] bytes = new byte[1024];
int total=-1;
while((total=inputStream.read(bytes))!=-1){
System.out.print(new String(bytes,0,total));
}
} catch (IOException e) {
e.printStackTrace();
}
//检查我们是否有文件上传请求
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
//为基于磁盘的文件创建一个工厂
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//创建一个新的文件上传程序
ServletFileUpload upload = new ServletFileUpload(diskFileItemFactory);
//解析请求
try {
List<FileItem> items = upload.parseRequest(request);
//处理上传的文件项目
Iterator iterator = items.iterator();
while (iterator.hasNext()) {
FileItem item = (FileItem) iterator.next();
if (item.isFormField()) {
//普通域
processFormField(item);
}else {
//文件域
processUpLoadFile(item,request);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
//处理文件域
private void processUpLoadFile(FileItem item, HttpServletRequest request) {
//获取文件的相关信息
String fieldName = item.getFieldName();
System.out.println("fieldName----->"+fieldName);
String filename = item.getName();
System.out.println("fileName------>"+filename);
String contentType = item.getContentType();
System.out.println("contentType---->"+contentType);
long size = item.getSize();
System.out.println("size-------->"+size);
//转储文件到服务器上
//存储文件的根路径
/**
* 他是转储到了工程发布出去的文件中,就是out文件夹下的artifacts--UploadFileDemo_war_exploded---web-inf--upload文件夹
*
*/
String realPath = request.getServletContext().getRealPath("/WEB-INF/upload");
File dir = new File(realPath);
if (!dir.exists()) {
//文件夹如果不存在就自动创建
dir.mkdirs();
}
//写文件
File file = new File(realPath + "/" + filename);
try {
item.write(file);
} catch (Exception e) {
e.printStackTrace();
}
}
//处理普通域
private void processFormField(FileItem item) {
String fieldName = item.getFieldName();//获取文件的名字
String value = null;
try {
/**
* String getString()。getString()方法将FileItem对象中保存的数据流内容以一个字符串返回。
* 它有两个重载形式。
* public java.lang.String getString()和
* public java.lang.String getString(java.lang.String encodeing) throws java.io.UnsupportedEncodingException。
*
* 前者 使用缺省的字符集编码将主体内容转换成字符串,
* 后者 使用参数指定的字符集编码。
*
* 如果在读取普通表单字段元素的内容时,出现了乱码现象,可以调用第二个方法,并传入 正确的字符集编码名称。
*
*/
//用UTF-8编码以字符串形式输出
value = item.getString("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(fieldName+"------>"+value);
}
二、文件的下载:
@WebServlet(name = "DownLoadFileServlet")
public class DownLoadFileServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过超链接方式都是get方法访问服务器
String file = request.getParameter("file");
//下载
String filePath = "";
String fileName = "";
switch (file) {
case "mp3":
fileName="拔萝卜.mp3";
filePath=request.getServletContext().getRealPath("/WEB-INF/resources/拔萝卜.mp3");
break;
case "jpg":
fileName="pic5.jpg";
filePath=request.getServletContext().getRealPath("/WEB-INF/resources/pic5.jpg");
break;
case "jar":
fileName="mysql.jar";
filePath=request.getServletContext().getRealPath("/WEB-INF/resources/mysql-connector-java-5.1.7-bin.jar");
break;
}
//针对IE或者以IE为内核的浏览器:
String userAgent = request.getHeader("User-Agent");
if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
fileName = URLEncoder.encode(fileName, "UTF-8");
} else {
//非IE浏览器的处理:
fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
}
//显示下载的文件名称
response.setHeader("content-disposition", "attachment;filename="+fileName);
//设置返回的文件类型,我们可以根据文件名称自动获取其类型
response.setContentType(this.getServletContext().getMimeType(fileName));
//处理文件名称中文的乱码
response.setCharacterEncoding("UTF-8");
//写数据-----边读边输出
FileInputStream fileInputStream = new FileInputStream(filePath);
ServletOutputStream outputStream = response.getOutputStream();
byte[] bytes = new byte[1024];
int total = -1;
while((total=fileInputStream.read(bytes))!=-1){
outputStream.write(bytes,0,total);
}
fileInputStream.close();
}
}