SpringBoot+Vue 图片上传保存到类型为BLOB类型的Oracle数据库(数据库可以直接看图片)

前言:项目中遇到需要将图片保存到Oracle数据库,并且数据库里面可以直接看图像。虽然这种方式不如直接存储url方便,回显也比较慢。但是后面可能会把图像同步给第三方,或者转库。所以要求在数据库里面存储图像

前端正文:

<image-upload class="picture_upload" style="width: 200px; height: 270px" :limit='1' v-model="form.tx"/>

若依封装的组件默认宽高是148px的,是一个正方形,我们存储的是一个图像,是5:7的证件照,所以宽高可以设置为200px , 280px 。这里需要注意的是上传组件还有一个隐藏层,就是鼠标悬浮在上面的时候会出现的层(隐藏层是预览和删除按钮),也是需要设置宽高的,而且这两层的宽高的设置应该是从你的页面里面。如果直接去依赖里面改的话也可以,但是好像只能从你本地显示出来样式,其他同事用这个样式的组件的话(就是200*280样式的)不显示这个你设置的宽高,因为代码提交到版本控制器的时候(如SVN)依赖是没法上传的,所以想到了把样式加在了页面里面,修改了这两个样式之后中间的加号就会移动到左上角,现在只需要将加号外面的一层设置为盒子居中显示就可以了。
这就是需改之后的样子

<style>
  .el-upload--picture-card {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 200px;
    height: 270px;
  }
  .el-upload-list__item-actions {
    width: 200px;
    height: 270px;
  }
  .li.el-upload-list__item.is-success {
    width: 200px;
    height: 270px;
    margin-left: 200px;
  }
  .component-upload-image .hide {
    width: 200px;
    height: 270px;
  }
  .el-upload-list__item.is-success {
    width: 200px;
    height: 270px;
  }
</style>

这里我设置的是270px。还有就是图像限制上传一张所以 :limit=‘1’ 。需要注意" : " 不加会报错。v-model 是双向绑定。
上传图片之后的路径
红框里面的就是我们上传之后的路径。" /profile " 是可以更改的,就是在我们后台application.yml文件里面
磁盘下没有目录会自己生成
所以我们传给后台的实体类里面图像的路径就是上面红框里面的,图像是真实存在的。
此时我们需要对图像做处理存储到数据库了…

后台正文:

    /**
     * 新增教师信息
     */
    @PreAuthorize("@ss.hasPermi('jsgl:jsxxb:add')")
    @Log(title = "教师信息", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody JsJsxxb jsJsxxb) throws IOException {
        return toAjax(jsJsxxbService.insertJsJsxxb(jsJsxxb));
    }

这是controller里面的,继续往下。

    /**
     * 新增教师信息
     *
     * @param jsJsxxb 教师信息
     * @return 结果
     */
    public int insertJsJsxxb(JsJsxxb jsJsxxb);

这是seivice里面的,继续往下。

    /**
     * 新增教师信息
     *
     * @param jsJsxxb 教师信息
     * @return 结果
     */
    @Override
    @ValidationID(field = "zgh", databaseName = "JS_JSXXB", message = "教师职工号不能重复")
    public int insertJsJsxxb(JsJsxxb jsJsxxb) {
        if (StringUtils.isNotEmpty(jsJsxxb.getTx())){
            JsJszpb jsJszpb = new JsJszpb();
            jsJszpb.setZgh(jsJsxxb.getZgh());
            jsJszpb.setZp(GenerateImageUtil.GetImgDate(jsJsxxb.getTx()));
            jsJszpbMapper.insertJsJszpb(jsJszpb);
        }
        return jsJsxxbMapper.insertJsJsxxb(jsJsxxb);
    }

这是impl里面的。我是先在这里做了判断,图像不为空的时候会将图像存到图像表里面。

GenerateImageUtil.GetImgDate(jsJsxxb.getTx())

就是这段代码。jsJsxxb.getTx()就是上面红色框框里面的路径 /profile/upload/2022/09/08/微信图片_20220908194922_20220908195545A002.png
我们将路径传入工具类,继续往下。

package com.ms.jwxt.config;
import com.ruoyi.common.utils.StringUtils;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;

/**
 * 生成图片工具类
 * Created by gs01 on 2022-09-07.
 */
public class GenerateImageUtil {
    /**
     * 图片路径转byte字节数组
     *
     */
    public static byte[] GetImgDate(String txPath) {
        //去掉图片路径txPath以 '/profile' 开头的 ,
        String newStr = txPath.replaceFirst("^/profile*","");
        //拼接新的图片路径(原因是系统找不到图片路径,所以从新做了拼接)
        String newPath = "D:/ruoyi/uploadPath"+newStr;
        InputStream in = null;
        byte[] data = null;
        // 读取图片字节数组
        try {
            in = new FileInputStream(newPath);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return data;
    }


}

我们传进来之后就会利用这个方法生成一个字节流存到byte[] 中,因为直接去路径下找不到文件,我就从新给他拼接了一下,去掉了以 ’ /profile ’ 开头的 ,然后拼接的,就会找到文件了。
此时实体类需要的byte [] 类型的我们就生成了,现在直接存进数据库就可以了。BLOB类型的Oracle数据库。

博主有话说:每天进步一点点。自律。坚持。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐