Не записываются изображения в БД 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 шт):
Ошибка возникает, потому что вы пытаетесь передать строку типа 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)
}