Я хочу спросить, как я могу отправить файл изображения в 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
Вы действительно правы в отношении сохранения пути изображения в MySQL вместо фактических данных изображения. MySQL не предназначен для хранения данных изображений.
Вы можете отправлять данные изображения на сервер так, как они описаны здесь: Как загрузить изображения и файл на сервер во Flutter?
Затем, как только вы получите данные изображения, вы можете сохранить изображение в каталоге на сервере. То, что вы сохраняете в MySQL, должно быть только путем к изображению на сервере или URL-адресом изображения.
@MohdAzwan Мне очень жаль, но не могли бы вы уточнить свой вопрос?
после того, как я успешно загрузил в MySQL, как я могу получить доступ к изображению в приложении? Мне уже удалось сохранить имя изображения в MySQL, и ответ ниже, но я не уверен, как использовать изображение.
@MohdAzwan Это зависит от многих вещей, но если у вас есть URL-адрес вашего бэкэнда, и, скажем, вы сохранили свое изображение в папке с именем images
, вы можете получить к нему доступ как https://example.com/images/filename.jpg
или что-то в этом роде.
Я почти уверен, что код находится в самой среде приложения, поскольку я уже использую этот ресурс в pubspec.yaml. но изображение, которое я хочу использовать, поступает из другого каталога, например, с рабочего стола или htdocs, я пытаюсь использовать ссылку, например C:\xampp\htdocs\foodsystem\uploads, для доступа к изображению, но студия показывает сбой на система.
@MohdAzwan Вы пробовали «10.0.2.2/foodsystem/image_name.jpeg»?
спасибо, ваш комментарий выше заставил меня сохранить изображение внутри самой среды приложения, а не сохранить его в файле htdocs в xampp. Просто нужно убедиться, что изображение будет существовать в папке активов, чтобы получить к нему доступ. Большое спасибо
@MohdAzwan С удовольствием.
Вы можете хранить изображения в 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:
Могу ли я узнать, где я должен ссылаться, когда читать изображение, загруженное в MySQL с помощью multipartFile?