Не записываются изображения в БД MySQL golang

Хотел записать данные с формы в бд(разные таблицы), но изображения почему то не записываются.

    func save_obj(w http.ResponseWriter, r *http.Request)  {
  title := r.FormValue("title")
  type_obj := r.FormValue("type_obj")
  location := r.FormValue("location")
  long := r.FormValue("long")
  fond := r.FormValue("fond")
  //video := r.FormValue("video")
  inf := r.FormValue("inf")
  pros := r.FormValue("pros")
  about := r.FormValue("about")
  //docs := r.FormValue("docs")
  //подключение
  db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:8889)/service")
  if err != nil {
    panic(err)
  }

  defer db.Close()

  //установка
  insert, err := db.Query(fmt.Sprintf("INSERT INTO `objects` (`title`, `type_obj`, `location`, `long`, `fond`, `inf`, `pros`, `about`)" +
  " VALUES('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')", title, type_obj, location, long, fond, inf, pros, about))
  if err != nil {
    panic(err)
  }
  defer insert.Close()
  imgOne := b64.URLEncoding.DecodeString(r.FormValue("img-1"))
  imgTwo := b64.URLEncoding.DecodeString(r.FormValue("img-2"))
  imgThree := b64.URLEncoding.DecodeString(r.FormValue("img-3"))
  imgFour := b64.URLEncoding.DecodeString(r.FormValue("img-4"))
  ins, er := db.Query(fmt.Sprintf("INSERT INTO `img-1` (`title`, `img`) VALUES('%s', '%s')", title, imgOne))
  if er != nil {
    panic(er)
  }
  defer ins.Close()
  insr, error := db.Query(fmt.Sprintf("INSERT INTO `img-2` (`title`, `img`) VALUES('%s', '%s')", title, imgTwo))
  if error != nil {
    panic(error)
  }
  defer insr.Close()
  in, Error := db.Query(fmt.Sprintf("INSERT INTO `img-3` (`title`, `img`) VALUES('%s', '%s')", title, imgThree))
  if Error != nil {
    panic(Error)
  }
  defer in.Close()
  //последнее изображение
  in, Error := db.Query(fmt.Sprintf("INSERT INTO `img-4` (`title`, `img`) VALUES('%s', '%s')", title, imgFour))
  if Error != nil {
    panic(Error)
  }
  defer in.Close()
  http.Redirect(w, r, "/create_obj", http.StatusSeeOther)

}

Все кроме записи работает исправно, но когда пытаюсь произвести запись, выводится ошибка:

cannot use r.FormValue("img-1") (type string) as type []byte in argument to base64.URLEncoding.EncodeToString

Почему не соответствуют типы и как можно зашифровать изображение в blob?


Ответы (1 шт):

Автор решения: hedgehogues

Ошибка возникает, потому что вы пытаетесь передать строку типа string в функцию b64.URLEncoding.DecodeString, которая ожидает на вход байтовый слайс.

Похоже, что вы пытаетесь записать изображения в базу данных, используя строковое представление изображений, которое закодировано в формате base64. Вам следует сначала декодировать эту строку из base64, а затем записать полученные байты в базу данных.

Чтобы декодировать строку, используйте функцию b64.URLEncoding.DecodeString, как показано ниже:

imgOneBytes, err := b64.URLEncoding.DecodeString(r.FormValue("img-1"))
if err != nil {
    panic(err)
}

Затем вы можете записать байты в базу данных, используя тип BLOB для хранения изображений:

_, err = db.Exec("INSERT INTO images (title, img) VALUES (?, ?)", title, imgOneBytes)
if err != nil {
    panic(err)
}
→ Ссылка