引用jar包
apache: commons-fileupload.jar 组件,依赖于 commons-io.jar
前台:jsp:
表单提交方式必须为post
在表单中必须增加一个属性 enctype =“multipart/form-data”
<form action = "UpAndDown" method ="post" enctype="multipart/form-data">
选择上传文件:<input type = "file" name = "upLoadFile">
</form>
注意的问题:
上传的目录 upload:
1,如果修改代码,则在tomcat重新启动时会被删除
原因: 当修改代码时 tomcat会重新编译一份class并且重新部署(重新创建各种目录)
2.如果不修改代码,则不会删除
因此,为了防止上传目录丢失: a.虚拟路径,b.直接更换上传目录到非tomcat目录
限制上传:类型,大小
注意:对文件的限制条件 写在parseRequest之前
下载:不需要依赖任何jar包
1.请求(地址) 请求servlet
2.servlet通过文件的地址 将文件转为输入流 读到servlet中
3.通过输出流将刚才已经转为输入流的文件输出给用户
需要设置2个响应头
response.addHeader(“contentType”, “application/octet-stream”);//MIME类型:二进制文件(任意文件)
response.addHeader(“content-Disposition”, “attachment;filename=”+filename);//filename包含了文件后缀
业务逻辑层(RomService.java)
package ServiceImpl;
import java.io.File;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import DaoImpl.DbDaoimpl;
import Service.Rom;
import entity.romData;
import entity.user;
public class RomImpl implements Rom {
@Override
public void upload(String path,String detail) {
String sql = "INSERT INTO rom(path,detail) VALUES (?,?)";
new DbDaoimpl().add(sql, path, detail);
}
@Override
public List<romData> getDataByPage(int index, int size) {
String sql = "SELECT * FROM rom LIMIT ? , ?";
List<romData> list = new ArrayList<>();
ResultSet result = new DbDaoimpl().Select(sql, index*size,(index+1)*size-1);
try{
while(result.next()){
int id = result.getInt(1);
String path = result.getString(2);
String detail = result.getString(3);
romData da = new romData(path,detail,id);
list.add(da);
}
}catch(Exception e){
System.out.println("getDataByPage in rom");
e.printStackTrace();
}
return list;
}
public void delete(String filename){
String sql = "DELETE FROM rom WHERE path = ?";
new DbDaoimpl().delete(sql, filename);
String path = "D:\\apache-tomcat-8.5.45\\upload\\" +filename;
File file = new File(path);
file.delete();
}
}
表示层后端:(delete.java)
package netRomServlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import ServiceImpl.RomImpl;
/**
* Servlet implementation class delete
*/
@WebServlet("/delete")
public class delete extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public delete() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = request.getParameter("filename");
new RomImpl().delete(filename);
response.sendRedirect("netRom.jsp");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
downloadService.java
package netRomServlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/downloadServlet")
public class downloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public downloadServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = request.getParameter("filename");
request.setCharacterEncoding("utf-8");
//下载文件:需要设置消息头
response.addHeader("contentType", "application/octet-stream");//MIME类型:二进制文件(任意文件)
response.addHeader("content-Disposition", "attachment;filename="+filename);//filename包含了文件后缀
//servlet通过文件的地址 将文件转为输入流 读到servlet中
String path = "D:\\apache-tomcat-8.5.45\\upload\\" +filename;
//InputStream in = getServletContext().getResourceAsStream(path);
File file = new File(path);
InputStream in = new FileInputStream(file);
//通过输出流将刚才已经转为输入流的文件输出给用户
ServletOutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int lenth = -1;
while((lenth = in.read(buffer))!=-1){
out.write(buffer,0,lenth);
}
in.close();
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
UpAndDown.java
package netRomServlet;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import ServiceImpl.RomImpl;
@WebServlet("/UpAndDown")
public class UpAndDown extends HttpServlet {
private static final long serialVersionUID = 1L;
public UpAndDown() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("utf-8");
String detail = null;
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
try{
if(isMultipart){//判断前台的form是否有multipart属性
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//控制上传文件大小 30kb
upload.setSizeMax(3000*1024);//字节B
//设置临时文件大小(缓冲文件大小)
factory.setSizeThreshold(1024*10);
//设置临时文件存放路径
//factory.setRepository(new File(path));
//通过parseRequest解析的form中的所有请求字段,并保存在items集合中(即前台转递的数据就保存在items中)
List<FileItem> items = upload.parseRequest(request);
Iterator in = items.iterator();
while(in.hasNext()){
FileItem item = (FileItem) in.next();
if(item.getFieldName().equals("detail")){//根据name属性判断item是那一个提交值
detail = item.getString();
}
if(item.getFieldName().equals("UploadFile")){
//文件上传:
//文件名: getFieldName是获取普通表单字段的Name值
//getName()是获取文件名
String filename = item.getName();
//获取文件内容并上传
//定义文件路径:指定上传的位置(服务器路径)
//获取服务器路径(指定到tomcat下会被清除)
//String path = request.getSession().getServletContext().getRealPath("upload");
if(filename.endsWith("pdf")||filename.endsWith("jpg")){
String path = "D:\\apache-tomcat-8.5.45\\upload";
File file = new File(path, filename);
new RomImpl().upload(filename, detail);
item.write(file);//上传
System.out.println("上传成功!");
request.setAttribute("good", "good");
}else{
request.setAttribute("type", "error");
}
}
}
}
}catch(FileUploadBase.SizeLimitExceededException e){
System.out.println("out of Size error!");
request.setAttribute("size", "error");
//e.printStackTrace();
} catch (Exception e) {
System.out.println("upAndDown error!");
e.printStackTrace();
}finally{
request.getRequestDispatcher("netRom.jsp").forward(request,response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
表示层前端(netRom.jsp)
<%@page import="ServiceImpl.RomImpl"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import = "ServiceImpl.RomImpl" %>
<%@ page import = "entity.romData" %>
<%@ page import = "java.util.List" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
if(request.getAttribute("good")!=null){
out.print("<script type = 'text/javascript'>alert('上传成功!');</script>");
}else if(request.getAttribute("type")!=null){
out.print("<script type = 'text/javascript'>alert('类型异常!');</script>");
}else if(request.getAttribute("size")!=null){
out.print("<script type = 'text/javascript>alert('文件太大!');</script>");
}
%>
<form action = "UpAndDown" method ="post" enctype="multipart/form-data">
备注:<input type = "text" name = "detail">
选择上传文件:<input type = "file" name = "UploadFile">
<input type = "submit" value = "上传">
</form>
<table border="1px">
<tr>
<th>id</th>
<th>详情</th>
<th>文件</th>
<th>下载</th>
<th>删除</th>
</tr>
<%
int index = 0;
String index_s = (String)request.getAttribute("index");
if(index_s != null){
index = Integer.parseInt(index_s);
}
List<romData> result = new RomImpl().getDataByPage(index, 10);
if(result != null){
for(romData da : result){
%>
<tr>
<td><%=da.getId() %></td>
<td><%=da.getDetail() %></td>
<td><%=da.getPath() %></td>
<th><a href = "downloadServlet?filename=<%=da.getPath()%>">下载</a></td>
<th><a href = "delete?filename=<%=da.getPath()%>">删除</a></td>
</tr><br/>
<%
}
}
%>
</table>
</body>
</html>