上传图片存入数据库中

687 阅读2分钟

一般实现上传文件功能会单独把文件存入单独的文件服务器中,然后在数据库中存储对应的文件路径,但是往往项目开发过程中总会有一些奇奇怪怪的问题,遇到过一个需求,需要有图片保存的功能,一个上传、一个下载,但是又不给提供图片服务器,同时项目服务器也是受限制的,所以只能找到一个很奇怪的方式,把图片以Base64的方式存储在数据库中。

实现思路

1、前端使用文件上传控件
2、把需要上传的文件转给base64字符串并传入后台
3、后端接收前台传入的图片字符串,把该字符串存入数据库clob字段中

代码实现

前端

添加上传文件控件,获取图片信息,把图片转换为base64参考代码如下:

<template>
  <div>
    <!--文件控件,用于上传图片-->
    <input type="file" id="imgInfo" @change="getFile($event)">
    <!--绑定变量,上传图片后用于图片预览-->
    <!-- 绑定上传图片方法,点击就请求后台存储图片 -->
    <button type="button" @click="uploadImgInfo()">上传图片</button>
  </div>
</template>

<script>
import { upload } from '@/api/mmyu/index.js' // 引入接口
export default {
  name: 'uploadImg',
  data () {
    return {
      base64QrCode: ''
    }
  },
  // 2、添加自定义组件
  components: {
  },
  // 初始化调用方法
  created () {

  },
  methods: {
    // 图片转成 base64
    getFile (event) {
      var that = this
      // 获取文件信息
      var files = document.getElementById('imgInfo').files[0]
      var reader = new FileReader()
      reader.onloadend = function () {
        that.userPhoto = reader.result
        // 把转换好的图片字符串放入 img 标签中进行预览
        this.base64QrCode = reader.result
        console.log(this.base64QrCode)
      }
      if (files) {
        reader.readAsDataURL(files)
      }
    },
    // 上传图片方法
    uploadImgInfo () {
      upload(this.base64QrCode).then(data => {

      })
    }
  }
}
</script>

上传方法 uploadImgInfo 参考代码如下:

import request from '../http'

export function upload (fileInfo) {
  return request({
    url: '/ming/img/upload?fileInfo=' + fileInfo,
    method: 'get'
  })
}

由于图片一般不会很大这里使用get也是可以的,如果图片过大,或者是需要上传文件那么这里应该使用post方法

后端代码

前面使用get方法请求,后端直接拿到传过来的base64字符串,把该字符串直接存入数据库中即可,需要注意的是存入时数据库字段长度的问题,如果使用varchar类型图片过大可能会存不下,建议使用clob类型或者text类型也可。

@RequestMapping("/upload")
public String getQrCode(@RequestParam String fileInfo){

以上就是把图片转为base64字符串存入数据库的整个操作,但是不推荐把文件存入数据库中!!!!