JavaWeb:Servlet文件上传与下载

本文详细介绍了如何使用JSP和Servlet进行文件上传和下载操作,包括设置MultipartConfig注解、解析文件上传请求、将文件保存至服务器指定目录并记录路径,以及实现文件的下载功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果

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();

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值