27_文件上传—添加商品

文件上传-添加商品

1)技术分析

文件上传(fileUpload)
浏览器要求:

  • post请求
  • input type=“file”
  • 表单的enctype=“multpart/form-data”

服务器要求

  • 通过request.getParameterXXX()获取的参数全部为空
  • 使用步骤:
    • 导入jar包
    • 创建一个磁盘文件项工厂
    • 创建一个核心文件上传对象 ServletUpload
    • 上传对象调用方法解析请求,获取一个List< FileItem >

添加商品(上传图片)

  1. 修改页面上添加链接:/store/adminProduct/addUI,请求转发到添加界面

  2. 在表单页面上

    • 修改action:/store/adminProduct/add
    • 上面的文件上传要求
    • 给每个字段添加name属性
  3. AdminProductServlet中处理add

    • 通过request.getParameterMap方法获取的信息全部为空
    • 我们想使用beanutils.ppopulate(bean,map)
    • 我们需要创建一个map集合,将前台接收过来的信息手动的put到map中
    • 注意:商品的图片(1.保存在服务器的磁盘;2.在数据中添加图片的位置)
  4. 调用serivice,重定向到查询界面


2)代码实现

① 修改页面跳转与修改add.jsp表单属性
	<script type="text/javascript">
		function addProduct(){
			window.location.href = "${pageContext.request.contextPath}/adminProduct/addUI";
		}
	</script>

处理/addUI,数据回显转发到add.jsp

	private void addUI(HttpServletRequest request, HttpServletResponse response) throws Exception {
		//查询所有的分类,返回list--数据回显
		List<Category> clist=categoryService.findAll();
		//绑定数据
		request.setAttribute("clist", clist);
		request.getRequestDispatcher("/admin/product/add.jsp").forward(request, response);
	}

add.jsp

	<form id="userAction_save_do" name="Form1" action="${pageContext.request.contextPath}/adminProduct/add" method="post" enctype="multipart/form-data">
		...
			<tr>
				<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
					商品图片:
				</td>
				<td class="ta_01" bgColor="#ffffff" colspan="3">
					<input type="file" name="pimage" />
				</td>
			</tr>
			<tr>
				<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
					所属分类:
				</td>
				<td class="ta_01" bgColor="#ffffff" colspan="3">
					<select name="cid">
							<c:forEach items="${clist }" var="c">
								<option value="${c.cid }">${c.cname }</option>
							</c:forEach>
							
					</select>
				</td>
			</tr>
			...
	</form>
② 在AdminProductServlet中处理add,文件上传
	private void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			//创建一个map集合放入请求参数
			HashMap<String, Object> map = new HashMap<>();
			//文件上传
			//创建磁盘文件项
			DiskFileItemFactory factory=new DiskFileItemFactory();
			//创建核心上传对象
			ServletFileUpload upload=new ServletFileUpload(factory);
			//解析request
			List<FileItem> list=upload.parseRequest(request);
			//遍历集合
			for(FileItem fi:list) {
				//判断是否是普通的上传组件
				if(fi.isFormField()) {
					//普通上传组件
					map.put(fi.getFieldName(),fi.getString("utf-8"));
				}else {
					//文件上传组件
					//获取文件名称
					String name=fi.getName();
					//获取文件的真实姓名 xxxx.xx
					String realName=UploadUtils.getRealName(name);
					//获取文件的随机名称
					String uuidName=UploadUtils.getRealName(realName);
					
					//获取文件的存放路径
					String path=this.getServletContext().getRealPath("/products/1");
					//获取文件流
					InputStream is=fi.getInputStream();
					//保存图片
					FileOutputStream fos = new FileOutputStream(new File(path, uuidName));
					//保存图片
					IOUtils.copy(is, fos);
					fos.close();
					is.close();
					//删除临时文件
					fi.delete();
					//在map中设置文件路径
					map.put(fi.getFieldName(),"products/1/"+uuidName);
				}
			}
			
			//1、封装参数
			Product p=new Product();
			BeanUtils.populate(p, map);
			//1.1 商品id
			p.setPid(UUIDUtils.getId());
			//1.2 商品时间
			p.setPdate(new Date());
			//1.3 封装category
			Category c=new Category();
			c.setCid((String)map.get("cid"));
			p.setCategory(c);
			//2、调用service完成添加
			productService.add(p);
			//3、页面重定向
			response.sendRedirect(request.getContextPath()+"/adminProduct/findAll");
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			request.setAttribute("msg", "商品添加失败");
			request.getRequestDispatcher("/jsp/msg.jsp").forward(request, response);
			return;
		}
		
	}
③ dao层
	@Override
	public void add(Product p) throws Exception {
		String sql="insert into product values(?,?,?,?,?,?,?,?,?,?)";
		qr.update(sql,p.getPid(),p.getPname(),p.getMarketPrice(),
				p.getShopPrice(),p.getPimage(),p.getPdate(),
				p.getIsHot(),p.getPdesc(),p.getPflag(),p.getCategory().getCid());
	}
④ 测试即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

robona

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值