效果
jsp代码
<form action="ProviderServlet?action=add" method="post" id="ff" enctype="multipart/form-data">
<div class="">
<label for="providerCard">营业执照:</label>
<input type="file" name="providerCard" id="providerId"/>
<span>*请输入供应商编码</span>
</div>
</form>
Servlet代码
主要目的:
1.向文件夹写入图片
2.把存入图片的绝对路径提交给业务逻辑层
@MultipartConfig //文件上传的支持
@WebServlet("/ProviderServlet")
if("add".equals(action)) {
String providerName = request.getParameter("providerName");//供应商名称
String people = request.getParameter("people");//联系人
String telphone = request.getParameter("telphone");//联系人电话
String fax = request.getParameter("fax");//传真地址
String description = request.getParameter("description");//描述
String fileName="";
//新增(带文件上传功能)
Collection<Part> parts = request.getParts();
for(Part p:parts){
String header = p.getHeader("content-disposition"); // form-data; name="providerCard"; filename="11111.jpg"
if(header.contains("filename")){
//正在循环的这个P对象就是文件上传框,以日期生成不重复的文件名
fileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())+"_"+getNameByHeader(header);
System.out.println("要上传的不重复文件名是:"+fileName+",上传的IP是:"+request.getRemoteAddr());
//获取上传的文件的真实的发布的服务器路径
ServletContext application = request.getServletContext();
String realPath = application.getRealPath("/cards");
realPath=createFile(realPath); //追加一个日期文件夹
//构建一个完成路径
File file=new File(realPath, fileName);
System.out.println("上传成功,上传的完整路径是:"+file.getAbsolutePath());
//上传文件
p.write(file.getAbsolutePath());
}
}
//新增对象到哦数据库
ProviderInfo p=new ProviderInfo(providerName, "/"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+"/"+fileName, people, telphone, fax, description,new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
int count = ps.addProvider(p);
if(count>0){
response.getWriter().write("<script>alert('新增成功');location.href='/MarkSystem/ProviderServlet?action=queryAll';</script>");
}else{
response.getWriter().write("<script>alert('新增失败');location.href='providerAdd.jsp';</script>");
}
}
}
/**
* 每天生成一个新的文件夹,安按照日期生成
* @param path
* @return
*/
public String createFile(String path){
// G:\apache-tomcat-8.0.53\webapps\MarkSystem\cards\2019-06-25
File f=new File(path,new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
if(!f.exists()){
f.mkdir();//创建路径
}
return f.getAbsolutePath();
}
/**
* 从消息头中获取上传的文件名称form-data; name="providerCard"; filename="11111.jpg"
* @param header
* @return
*/
public String getNameByHeader(String header){
String[] arrays = header.split(";");
if(arrays.length==3){
String line = arrays[2]; // filename="11111.jpg"
String str = line.split("=")[1]; // "11111.jpg"
str=str.replaceAll("\"", "");
return str;
}
return "";
}
Servlet下载
//3.开始下载
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(fileName,"utf-8"));
//5.用文件流的方式返回
FileInputStream fis=new FileInputStream(downPath);//输入流
ServletOutputStream os = response.getOutputStream();//响应流
byte[] bytes=new byte[1024]; //缓冲区 1024byte=1kb
int data = fis.read(bytes);
while(data!=-1){
os.write(bytes, 0, bytes.length);
data = fis.read(bytes);
}
//6.关闭流
os.close();
fis.close();