图片上传的实现的各种坑

注意

String filePath = request.getSession().getServletContext().getRealPath("/");
File dir = new File("filePath ");
这段代码的意思:request.getSession().getServletContext() 获取的是Servlet容器对象,相当于tomcat容器了。getRealPath("/") 获取实际路径,“/”指代项目根目录,所以代码返回的是项目在容器中的实际发布运行的根路径;

在本文中
File dir = new File("filePath");
是直接在项目根目录下创建filePath 文件或文件夹

1.步骤:

把前端的图片传到后端controller,然后截取文件的后缀,用uuid + 上传的文件名后缀拼接成新的图片文件名字,然后把图片文件存到项目根目录的/data/image目录下,在把图片路径存到数据库

上代码:

1.前端图片上传代码:

<c:if test="${not empty n.image}">判断是否有图片,有就显示,没有就不显示;
然后通过<input id="file_upload" type="file" name="file" onchange="imgChange(this)"/>中的onchange="imgChange(this)"方法进行表单验证;让用户选择图片后并能显示,并且获取图片的后缀;

                <label class="col-sm-2 control-label">图片上传</label>
                <div class="col-sm-4">
                    <input id="file_upload" type="file" name="file" onchange="imgChange(this)"/>
                    <c:if test="${not empty n.image}">
                        <img id="uploaded_images" src="${ctx }${n.image}" class="img-rounded" style="width: 150px"/>
                    </c:if>
                    <c:if test="${empty n.image}">
                        <img id="uploaded_images" src="" class="img-rounded" style="width: 150px"/>
                    </c:if>
                    <input name="image" type="hidden" value="${n.image}">
                </div>
            </div>

onchange="imgChange(this)方法的js代码:

    //显示需要上传图片的所路途、图片文件验证
    // 选择图片显示
    function imgChange(obj) {
        // 获取点击的文本框
        var file = document.getElementById("file_upload");
        var fileSize = file.files[0].size;
        //input框内的图片路径值obj.value
        var fileName = obj.value;
        //截取图片文件名的后缀并转为小写
        var fileNameSuffix = fileName.substring(fileName.lastIndexOf(".")+1).toLowerCase();
        // alert(fileNameSuffix);
        //图片文件格式验证
        if(fileNameSuffix !="jpg" && fileNameSuffix !="jpeg" && fileNameSuffix !="png"){
            //清空input框内的图片路径值obj.value
            obj.value = "";
            layer.msg("请选择图片格式文件上传(jpg,jpeg,png等)!");
            return false;
        }
        //文件大小验证
        if(fileSize/1024>1000){
//            file.outerHTML = file.outerHTML;
            //清空input框内的图片路径值obj.value
            obj.value = "";
            layer.msg("图片不能大于1M");
            return false;
        }
        var imgUrl = window.URL.createObjectURL(file.files[0]);
        var img = document.getElementById('uploaded_images');
        img.setAttribute('src', imgUrl); // 修改img标签src属性值
    };
后端保存更新的代码:如果知识图片上传只需关注图片上传的相关代码
     * 保存、更新
     * @param dto
     * @param file
     * @param request
     * @return
     * @throws Exception
     */
    @ResponseBody
    @RequestMapping(value = "/save")
    @PreAuthorize("(hasRole('aboutUs.update') and #dto.id != null) or (hasRole('aboutUs.add') and #dto.id == null)")
    public String save(AboutUsDTO dto, @RequestParam(value = "file", required = false) MultipartFile file, HttpServletRequest request) throws Exception {
        if(verify(dto,file)){
            if (dto.getId() == null) {
                dto.setCreated(new Date());
                dto.setUpdateTime(new Date());
                dto.setDeleted(false);
                //上传图片
//              uploadImg(file,model,request);
                //上传图片
                String imgPath = saveImgFileAndPath(file,dto,request);
                //保存图片地址
                if(StringUtils.isNotBlank(imgPath)){
                    dto.setImage(imgPath);
                }
                aboutUsService.save(dto);
            } else {
                AboutUs old = aboutUsService.load(dto.getId());
                //set类型
                AboutUsTypeDTO aboutUsTypeDTO = new AboutUsTypeDTO();
                aboutUsTypeDTO.setId(dto.getAboutUsType().getId());
                old.setAboutUsType(aboutUsTypeDTO);
                //set更新的时间
                old.setUpdateTime(new Date());
                //上传图片
                String imgPath = saveImgFileAndPath(file,old,request);
                //保存图片地址
                if(StringUtils.isNotBlank(imgPath)){
                    old.setImage(imgPath);
                }
                old.setDescription(dto.getDescription());
                aboutUsService.updateAllFields(old);
            }
        }
        return ok();
    }

@RequestParam(value = "file", required = false) MultipartFile file中的required = false让file可以没有数据,这样可以避免修改时用户点击上传但并没有选择图片时提交而报错;
String imgPath = saveImgFileAndPath(file,dto,request);这个方法把图片文件保存到@Value("${image.upload.path}") private String path;这个路径中,文件名字是uuid+图片的后缀;

saveImgFileAndPath方法:
     * 保存图片文件并且获取图片地址
     * @param file
     * @param model
     * @param request
     * @return
     */
    public String saveImgFileAndPath(MultipartFile file, AboutUs model, HttpServletRequest request){
        if(file != null) {
            String fileName = file.getOriginalFilename();
            String newFileName = FileNameUtils.getFileName(fileName);
            //保存图片文件
            String imgPath = upload(newFileName, request, file);
            if(StringUtils.isNotBlank(imgPath)){
                String imgName = imgPath.substring(imgPath.lastIndexOf("/"));
                imgPath = path.substring(path.lastIndexOf("/"));
                return imgPath+imgName;
            }
        }
        return null;
    }
//保存图片文件
String imgPath = upload(newFileName, request, file);

方法的代码:

     * @author huZhiQiang
     * 把图片文件保存到${image.upload.path}目录下
     * request.getSession().getServletContext().getRealPath() 得到站点的绝对地址
     * @param newFileName
     * @param request
     * @param file
     * @return
     */
    public String upload(String newFileName, HttpServletRequest request,MultipartFile file){
        String contentType = file.getContentType();
        String fileName = file.getOriginalFilename();
        logger.error("contentType", contentType);
        logger.error("filename1:" + fileName);
        logger.error("filePath1:" + path);
//      String newFileName = "";
        if(StringUtils.isNotBlank(fileName)){
            try {
                /*FileUtils.upload(file.getBytes(), path, newFileName);*/
                String imgPath = imageService.saveImage(newFileName,file.getBytes());//保存图片文件
                // 拼接图片url
//              String imgHost = MyWebUtils.getCtx();
//              String imgUploadPath = path;
//              String imgName = newFileName;
//              String imgPath = imgHost + imgUploadPath + "/" + imgName;
                logger.error("拼接好的图片上传路径为:" + imgPath);

                return imgPath;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

imageService.saveImage(newFileName,file.getBytes())的代码:

     * 上传图片并返回完整访问路径
     * 
     * @return
     */
    public String saveImage(String fileName, byte[] data) {
        if (uploadType == UPLOAD_TYPE_LOCAL) {
            if (StringUtils.isBlank(fileName) || !fileName.contains(".")) { // 为空或没有后缀
                fileName = UUID.randomUUID().toString();
            } else {
                fileName = UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."));
            }

            File dir = new File(imagePath);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            if (!dir.exists()) {
                throw new BizException("无法创建图片上传路径" + imagePath);
            }
            try {
                FileUtils.writeByteArrayToFile(new File(dir, fileName), data);
                return MyWebUtils.getCtx() + "/image/" + fileName;
            } catch (IOException e) {
                throw new BizException("保存图片失败:" + e.getMessage(), e);
            }
        } else if (uploadType == UPLOAD_TYPE_CDN) {
            return qiniuService.upload(data, fileName);
        } else {
            throw new BizException("图片上传配置错误");
        }
    }

搞定!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值