Как загрузить изображение с помощью флаттера и php в MySQL

Я хочу спросить, как я могу отправить файл изображения в MySQL, используя метод post? Поскольку я загружал только путь к файлу, а не изображение.

мой почтовый запрос:

Future addProduct() async{

var url = 'http://10.0.2.2/foodsystem/addproduct.php';


http.post(url, body: {
  "productname": controllerName.text,
  "productprice": controllerPrice.text,
  "producttype": controllerType.text,
  "product_owner": globals.userId,
  "image": _image.path,
  //"image": _image.path.split('/').last,
});

мой PHP-код:

<?php

  include 'conn.php';


  $product_owner = $_POST['product_owner'];
  $productname = $_POST['productname'];
  $productprice = $_POST['productprice'];
  $producttype = $_POST['producttype'];
  $image = $_POST['image'];

  //$realImage = base64_decode($image);

  $connect->query("INSERT INTO product (product_name, product_price, product_type, product_owner, image) VALUES 
('".$productname."','".$productprice."','".$producttype."','".$product_owner."','".$image."')")


?>

моя таблица MySQL

Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout.
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout.
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для...
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
1
0
9 383
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Вы можете отправлять данные изображения на сервер так, как они описаны здесь: Как загрузить изображения и файл на сервер во Flutter?

Затем, как только вы получите данные изображения, вы можете сохранить изображение в каталоге на сервере. То, что вы сохраняете в MySQL, должно быть только путем к изображению на сервере или URL-адресом изображения.

Могу ли я узнать, где я должен ссылаться, когда читать изображение, загруженное в MySQL с помощью multipartFile?

Mohd Azwan 02.01.2021 09:21

@MohdAzwan Мне очень жаль, но не могли бы вы уточнить свой вопрос?

dshukertjr 02.01.2021 09:56

после того, как я успешно загрузил в MySQL, как я могу получить доступ к изображению в приложении? Мне уже удалось сохранить имя изображения в MySQL, и ответ ниже, но я не уверен, как использовать изображение.

Mohd Azwan 02.01.2021 13:02

@MohdAzwan Это зависит от многих вещей, но если у вас есть URL-адрес вашего бэкэнда, и, скажем, вы сохранили свое изображение в папке с именем images, вы можете получить к нему доступ как https://example.com/images/filename.jpg или что-то в этом роде.

dshukertjr 02.01.2021 13:06

Я почти уверен, что код находится в самой среде приложения, поскольку я уже использую этот ресурс в pubspec.yaml. но изображение, которое я хочу использовать, поступает из другого каталога, например, с рабочего стола или htdocs, я пытаюсь использовать ссылку, например C:\xampp\htdocs\foodsystem\uploads, для доступа к изображению, но студия показывает сбой на система.

Mohd Azwan 02.01.2021 13:20

@MohdAzwan Вы пробовали «10.0.2.2/foodsystem/image_name.jpeg»?

dshukertjr 02.01.2021 13:24

спасибо, ваш комментарий выше заставил меня сохранить изображение внутри самой среды приложения, а не сохранить его в файле htdocs в xampp. Просто нужно убедиться, что изображение будет существовать в папке активов, чтобы получить к нему доступ. Большое спасибо

Mohd Azwan 02.01.2021 13:33

@MohdAzwan С удовольствием.

dshukertjr 02.01.2021 13:35

Вы можете хранить изображения в MySQL. Его примитивный тип — BLOB. это полезно, если размер изображения меньше, так как изображение может загружаться быстро. Если размер изображения большой, то время его загрузки будет большим, поэтому делать это не рекомендуется. Сохранение пути к изображению по-прежнему является лучшим вариантом.

Да, вы можете хранить изображения в базе данных, но, на мой взгляд, это нецелесообразно и не является общепринятой практикой.

Общей практикой является хранение изображений в каталогах файловой системы и сохранение ссылок на изображения в базе данных. например путь к изображению, имя изображения и т. д. Или, в качестве альтернативы, вы даже можете хранить изображения в сети доставки контента (CDN) или на многочисленных хостах на большом пространстве физической территории и хранить ссылки для доступа к этим ресурсам в базе данных.

Изображения могут быть довольно большими, более 1 МБ. Таким образом, хранение изображений в базе данных потенциально может создать ненужную нагрузку на вашу базу данных и сеть между вашей базой данных и вашим веб-сервером, если они находятся на разных хостах.

Вам нужно сохранить как большой двоичный объект, тип данных LONGBLOB в mysql будет работать.

CREATE TABLE 'test'.'pic' (
    'idpic' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
    'caption' VARCHAR(45) NOT NULL,
    'img' LONGBLOB NOT NULL,
  PRIMARY KEY ('idpic')
)

это плохая практика, но это можно сделать. Однако не уверен, что этот код будет хорошо масштабироваться.

  $data = file_get_contents($_FILES['photo']['tmp_name']);
Ответ принят как подходящий

Это решение, которое я использую для загрузки изображения в базу данных. По сути, я использую путь к изображению для сохранения в MySQL. Потом сам образ сохраняю в папку htdoc и работает.

Код Flutter: (сначала необходимо импортировать важную библиотеку)

import "package:async/async.dart";

import 'package:path/path.dart';

import 'dart:io';

import 'package:http/http.dart' as http;

Future addProduct(File imageFile) async{
// ignore: deprecated_member_use
var stream= new http.ByteStream(DelegatingStream.typed(imageFile.openRead()));
var length= await imageFile.length();
var uri = Uri.parse("http://10.0.2.2/foodsystem/uploadg.php");

var request = new http.MultipartRequest("POST", uri);

var multipartFile = new http.MultipartFile("image", stream, length, filename: basename(imageFile.path));

request.files.add(multipartFile);
request.fields['productname'] = controllerName.text;
request.fields['productprice'] = controllerPrice.text;
request.fields['producttype'] = controllerType.text;
request.fields['product_owner'] = globals.restaurantId;

var respond = await request.send();
if (respond.statusCode==200){
  print("Image Uploaded");
}else{
  print("Upload Failed");
}

PHP-код:

<?php

  include 'conn.php';


  $image = $_FILES['image']['name'];
  $product_owner = $_POST['product_owner'];
  $productname = $_POST['productname'];
  $productprice = $_POST['productprice'];
  $producttype = $_POST['producttype'];

  $imagePath = "uploads/".$image;

  move_uploaded_file($_FILES['image']['tmp_name'],$imagePath);
  $connect->query("INSERT INTO product (product_name, product_price, product_type, product_owner, image) VALUES ('".$productname."','".$productprice."','".$producttype."','".$product_owner."','".$image."')");
//$connect->query("INSERT INTO product (product_name,image) VALUES ('".$productname."','".$image."')");

?>

Результат в MySQL:

Результат в папке htdoc:

Другие вопросы по теме

Похожие вопросы