易生活(一)---商品上传、smartupload使用、虚拟路径

目录

  • 上传商品业务逻辑分析
  • 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);

你可能感兴趣的:(电商,虚拟路径,逻辑分析,SmatUpload)