javaEE 使用表单上传图片

上传思路

1.创建工厂对象

FileItemFactory fileItemFactory = new DiskFileItemFactory();

DiskFileItemFactory()的构造方法:  采用默认临界值和系统临时文件夹构造文件项工厂对象。

DiskFIleItemFactory类 ,该类创建FileItem对象的工厂类,开发人员可以在这个工厂类上配置上传过程中的

内存缓冲区大小和存放临时文件的目录,其中的repository属性主要指定上传文件保存的目录,sizeThreshold属性

则设置在内存中缓冲区大小


2.使用对象ServletFileUpload

ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
    org.apache.commons.fileupload.servlet.ServletFileUpload类是Apache文件上传组件处理文件上传的核心高级类(所谓高级就是不需要管底层实现,暴露给用户的简单易用的接口)。

3.判断表单enctype为否为mutipart-data

servletFileUpload .isMultipartContent(request)

4.如果表单含有上传标签,那么getParamMap方法失效,因为前台input太多,所以我们要使用beanUtils快速封装,那么我们就需要自己封装Map了

Map<String, String> paramsMap = new HashMap<String, String>();

5.调用servletFileUpload 的parseRequest()方法使用其parseRequest(HttpServletRequest) 方法可以将通过表单中每一个HTML标签提交的数据封装成一个FileItem对象,然后以List列表的形式返回。

List<FileItem> itemList = sf.parseRequest(request);

6.开始上传

for (FileItem fileItem : itemList) {
	if (!fileItem.isFormField())// 判断是否为上传组件
	{
		// 1.1执行上传
		// 1.1.1获取服务器上传目录路径
		String path = getServletContext().getRealPath("/products");
		// 1.1.2上传
		InputStream is = fileItem.getInputStream();
		// getFieldName()获取表单标签name属性值
		// getName()获取文件名
		// getString()获取表单标签value值
		FileOutputStream fos = new FileOutputStream(new File(path,fileItem.getName()));
		IOUtils.copy(is, fos);
		// 清除临时文件
		fileItem.delete();
		is.close();
		fos.close();
		// 将pimage属性存入map
		paramsMap.put(fileItem.getFieldName(), "products/"+ fileItem.getName());
		} else// 普通组件
		{
		paramsMap.put(fileItem.getFieldName(),fileItem.getString("UTF-8"));
		}

	}

以下是全部代码 

java后台代码

	public void add(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException, FileUploadException,
			IllegalAccessException, InvocationTargetException {
		FileItemFactory fileItemFactory = new DiskFileItemFactory();
		ServletFileUpload sf = new ServletFileUpload(fileItemFactory);
		if (sf.isMultipartContent(request))// 判断表单enctype为否为mutipart-data
		{
			// 如果表单含有上传标签,那么getParamMap方法失效,
			// 因为前台input太多,所以我们要使用beanUtils快速封装,那么我们就需要自己封装Map了
			Map<String, String> paramsMap = new HashMap<String, String>();
			List<FileItem> itemList = sf.parseRequest(request);
			// 1.上传
			for (FileItem fileItem : itemList) {
				if (!fileItem.isFormField())// 判断是否为上传组件
				{
					// 1.1执行上传
					// 1.1.1获取服务器上传目录路径
					String path = getServletContext().getRealPath("/products");
					// 1.1.2上传
					InputStream is = fileItem.getInputStream();
					// getFieldName()获取表单标签name属性值
					// getName()获取文件名
					// getString()获取表单标签value值
					FileOutputStream fos = new FileOutputStream(new File(path,
							fileItem.getName()));
					IOUtils.copy(is, fos);
					// 清除临时文件
					fileItem.delete();
					is.close();
					fos.close();
					// 将pimage属性存入map
					paramsMap.put(fileItem.getFieldName(), "products/"
							+ fileItem.getName());
				} else// 普通组件
				{
					paramsMap.put(fileItem.getFieldName(),
							fileItem.getString("UTF-8"));
				}

			}
			// 2.封装product对象 保存到数据库里
			Product product = new Product();
			BeanUtils.populate(product, paramsMap);
			// 调用保存保存
			boolean result = ps.addProduct(product);
			if (result) {
				response.getWriter()
						.println(
								"<script>confirm('添加成功');location.href='/ShopStore/product?method=list';</script>");
			} else {
				response.getWriter()
						.println(
								"<script>confirm('添加失败');location.href='/ShopStore/admin/product/add.jsp;</script>");
			}
		}
	}

Html 前台代码

			<table cellSpacing="1" cellPadding="5" width="100%" align="center" bgColor="#eeeeee" style="border: 1px solid #8ba7e3" border="0">
				<tr>
					<td class="ta_01" align="center" bgColor="#afd1f3" colSpan="4"
						height="26">
						<strong><STRONG>添加商品</STRONG>
						</strong>
					</td>
				</tr>

				<tr>
					<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
						商品名称:
					</td>
					<td class="ta_01" bgColor="#ffffff">
						<input type="text" name="pname" value="" id="userAction_save_do_logonName" class="bg"/>
					</td>
					<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
						是否热门:
					</td>
					<td class="ta_01" bgColor="#ffffff">
						<select name="is_hot">
							<option value="1">是</option>
							<option value="0">否</option>
						</select>
					</td>
				</tr>
				<tr>
					<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
						市场价格:
					</td>
					<td class="ta_01" bgColor="#ffffff">
						<input type="text" name="market_price" value="" id="userAction_save_do_logonName" class="bg"/>
					</td>
					<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
						商城价格:
					</td>
					<td class="ta_01" bgColor="#ffffff">
						<input type="text" name="shop_price" value="" id="userAction_save_do_logonName" class="bg"/>
					</td>
				</tr>
				<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">
							<option value="1">大型电器</option>
							<option value="2">手机数码</option>
							<option value="3">衣帽箱包</option>
						</select>
					</td>
				</tr>
				<tr>
					<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
						商品描述:
					</td>
					<td class="ta_01" bgColor="#ffffff" colspan="3">
						<textarea name="pdesc" rows="5" cols="30"></textarea>
					</td>
				</tr>
				<tr>
					<td class="ta_01" style="WIDTH: 100%" align="center"
						bgColor="#f5fafe" colSpan="4">
						<button type="submit" id="userAction_save_do_submit" value="确定" class="button_ok">
							确定
						</button>

						<FONT face="宋体">       </FONT>
						<button type="reset" value="重置" class="button_cancel">重置</button>

						<FONT face="宋体">       </FONT>
						<INPUT class="button_ok" type="button" οnclick="history.go(-1)" value="返回"/>
						<span id="Label1"></span>
					</td>
				</tr>
			</table>
		</form>



  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值