上传思路
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>