目录
- 上传商品业务逻辑分析
- SmartUpload上传文件逻辑处理以及注意事项
- 如何配置虚拟文件存储路径
- 该部分源码,不包括调用的其它层代码。
上传商品业务逻辑分析
核心逻辑
/* * 上传商品所有逻辑: * 第一步:点击添加商品按钮,携带过来商家ID、商家产品的商品所属的全部三级分类信息。 * 第二步:提交之后,初始化第三方文件上传框架SmartUpload,为获取普通表单数据做准备。注意,获取普通表单数据不能使用传统方式,在smartUpload.upload()之后,用该框架提供的方法获取表单数据。 * 第三步:上传文件。 * 第四步:获取商品表单基本信息之后插入商品表,返回插入商品的id * 第五步:遍历存储分类ID和返回的商品ID插入到三级分类中间表。 * 第六步:遍历获取到的商品图片路径和商品ID存储到商品图片表。 */
SmartUpload上传文件逻辑处理以及注意事项
逻辑处理
// 第二步,初始化SmartUpload SmartUpload smartUpload = new SmartUpload(); smartUpload.initialize(config, req, resp); try { smartUpload.upload();// 此步操作之后才可以获取普通表单参数 } catch (SmartUploadException e) { e.printStackTrace(); } Map<String, String> parameterMap = new HashMap<String, String>(); @SuppressWarnings("rawtypes") Enumeration em = smartUpload.getRequest() .getParameterNames(); /* * 这一块处理获取普通表单, 存储到Map中然后用beanutils进行封装 */ while (em.hasMoreElements()) { String key = (String) em.nextElement(); String value = smartUpload.getRequest().getParameter(key); parameterMap.put(key, value); } BeanUtils.populate(goods, parameterMap);// 我们在这里获取自己封装的数据 String[] threeclassid = smartUpload.getRequest() .getParameterValues("threeclassid");// 获取分类列表ID // 第三步:上传文件 String dir = ParamUtils.SAVEPATP + ParamUtils.SAVEPATP_GOODS; File file = new File(dir); if (!file.exists()) { file.mkdirs();// 文件夹不存在,创建 } for (int i = 0; i < smartUpload.getFiles().getCount(); i++) { // 用户上传少于四张时处理 if (smartUpload.getFiles().getFile(i).getSize() == 0) continue; Goodsimg goodsimg = new Goodsimg();// 存放商品图片路径 com.jspsmart.upload.File myFile = smartUpload.getFiles() .getFile(i); String fileName = myFile.getFileName(); long currentTimeMillis = System.currentTimeMillis(); String saveName = currentTimeMillis + fileName.substring(fileName.lastIndexOf(".")); String saveFullPath = dir + saveName; goodsimg.setImgaddress(saveFullPath.substring(1)); goodsimgs.add(goodsimg);// 保存路径 try { smartUpload.getFiles().getFile(i).saveAs(saveFullPath); } catch (SmartUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
注意事项
- 上传文件不能使用普通的方式获取表单数据,可以使用smartupload提供的方法获取。特别注意,必须在smartUpload.upload();之后才可以通过smartUpload.getRequest().getParameterNames();获取普通表单参数列表。
- 上传文件之前必须判断文件夹是否存在,不存在创建。(if (!file.exists())…)
- 当用户上传的照片数量少于我们设定的照片数量时,需要处理,不然会报下标越界,原因很容易分析出来。(if (smartUpload.getFiles().getFile(i).getSize() == 0)continue;)
- 注意编码问题,SmartUpload对于上传的文件名只支持GBK编码,如果有中文,需要特别注意。可以使用修改过该组件的以支持其它编码。
- 对于文件名,为了避免重名,采用当前时间加后缀的方式命名。注意截取字符串问题。
如何配置虚拟文件存储路径
需求
- 项目名:elife
- 我们项目需要把图片保存到D盘save文件夹。当然,save内部还可能包括多层。
- 需要保证文件上传到该根目录。数据库保存的图片可以在浏览器读取出来。
实现
在tomcat的server.xml的节点下配置(问号换成“>”)
<Context path="/elife/save" docBase="D:\save" reloadable="false"/?
在服务端设置保存路径,根目录设置为“/save”,内部文件夹不要求。
- 保存路径是,需要将“/save”的“/”截取掉,保证显示时是相对路径。具体实现参考下面源码。
该部分源码,不包括调用的其它层代码。
/*
* 添加商品
*/
/*
* 上传商品所有逻辑:
* 第一步:点击添加商品按钮,携带过来商家ID、商家产品的商品所属的全部三级分类信息。
* 第二步:提交之后,初始化第三方文件上传框架SmartUpload,为获取普通表单数据做准备。注意,获取普通表单数据不能使用传统方式,在smartUpload.upload()之后,用该框架提供的方法获取表单数据。
* 第三步:上传文件。
* 第四步:获取商品表单基本信息之后插入商品表,返回插入商品的id
* 第五步:遍历存储分类ID和返回的商品ID插入到三级分类中间表。
* 第六步:遍历获取到的商品图片路径和商品ID存储到商品图片表。
*/
List<Goodsimg> goodsimgs = new ArrayList<Goodsimg>();// 商品图片列表
Goods goods = new Goods();// 商品
try {
// 第二步,初始化SmartUpload
SmartUpload smartUpload = new SmartUpload();
smartUpload.initialize(config, req, resp);
try {
smartUpload.upload();// 此步操作之后才可以获取普通表单参数
} catch (SmartUploadException e) {
e.printStackTrace();
}
Map<String, String> parameterMap = new HashMap<String, String>();
@SuppressWarnings("rawtypes")
Enumeration em = smartUpload.getRequest()
.getParameterNames();
/*
* 这一块处理获取普通表单, 存储到Map中然后用beanutils进行封装
*/
while (em.hasMoreElements()) {
String key = (String) em.nextElement();
String value = smartUpload.getRequest().getParameter(key);
parameterMap.put(key, value);
}
BeanUtils.populate(goods, parameterMap);// 我们在这里获取自己封装的数据
String[] threeclassid = smartUpload.getRequest()
.getParameterValues("threeclassid");// 获取分类列表ID
System.out.println(TAG + "测试打印goods:" + goods);
System.out.println(TAG + ":测试打印分类列表:"
+ Arrays.toString(threeclassid));
// 第三步:上传文件
String dir = ParamUtils.SAVEPATP + ParamUtils.SAVEPATP_GOODS;
File file = new File(dir);
if (!file.exists()) {
file.mkdirs();// 文件夹不存在,创建
}
for (int i = 0; i < smartUpload.getFiles().getCount(); i++) {
// 用户上传少于四张时处理
if (smartUpload.getFiles().getFile(i).getSize() == 0)
continue;
Goodsimg goodsimg = new Goodsimg();// 存放商品图片路径
com.jspsmart.upload.File myFile = smartUpload.getFiles()
.getFile(i);
String fileName = myFile.getFileName();
long currentTimeMillis = System.currentTimeMillis();
String saveName = currentTimeMillis
+ fileName.substring(fileName.lastIndexOf("."));
String saveFullPath = dir + saveName;
goodsimg.setImgaddress(saveFullPath.substring(1));
goodsimgs.add(goodsimg);// 保存路径
try {
smartUpload.getFiles().getFile(i).saveAs(saveFullPath);
} catch (SmartUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(TAG + "文件已上传");
// 第四步:添加商品到商品表,返回ID
int returnId = goodsService.addGoods(goods);
System.out.println(TAG + "商品id" + returnId);
if (returnId != -1) {
goods.setId(returnId);// 获取返回的商品id
} else {
System.out.println(TAG + "上传商品失败");
}
// 第五步:根据获取到商品id,保存三级分类中间表
for (int i = 0; i < threeclassid.length; i++) {
Goodsclass goodsclass = new Goodsclass();
goodsclass.setClassthreeid(Integer
.parseInt(threeclassid[i]));
goodsclass.setGoodsid(goods.getId());
boolean isAdd = goodsService.addGoodsClass(goodsclass);
if (isAdd) {
System.out.println(TAG + ":" + "添加三级分类中间表成功");
} else {
System.out.println(TAG + ":" + "添加三级分类中间表失败");
}
goodsclass = null;// 释放资源
}
// 第六步,保存商品图片到商品图片表
for (Goodsimg gs : goodsimgs) {
gs.setGoodsid(returnId);// 保存商品id
boolean isAdd = goodsService.addGoodsImg(gs);
if (isAdd) {
System.out.println(TAG + "添加商品图片表成功!");
} else {
System.out.println(TAG + "添加商品图片表失败");
}
}
goodsimgs = null;// 释放内存
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(TAG + ":测试打印数据:" + goods);