如何在 MySQL 中使用 Flutter 和 php 上传图片
Posted
技术标签:
【中文标题】如何在 MySQL 中使用 Flutter 和 php 上传图片【英文标题】:how to upload image using flutter and php in the MySQL 【发布时间】:2021-03-30 19:20:03 【问题描述】:我想问如何使用 post 方法将图像文件发布到 mysql?因为我所做的只是上传文件路径而不是图像。
我的发帖请求:
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 表
【问题讨论】:
【参考方案1】:这是我用来将图像上传到数据库的解决方案。基本上,我使用图像路径保存到 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 文件夹中的结果:
【讨论】:
【参考方案2】:关于将图像的路径而不是实际的图像数据存储到 MySQL 中,您实际上是正确的。 MySQL 不是为存储图像数据而构建的。
您可以使用他们在此处描述的方式将图像数据发送到后端: How to upload images and file to a server in Flutter?
然后,一旦您收到图像数据,您就可以将图像存储在服务器的目录中。您在 MySQL 中保存的内容应该只是服务器内的图像路径或图像的 URL。
【讨论】:
请问,使用multipartFile上传到MySQL的图片应该在哪里读取? @MohdAzwan 很抱歉,您能澄清一下您的问题吗? 成功上传到MySQL后,如何访问应用中的图片?我已经成功将图片的名字保存到了 MySQL 中,答案如下,但是不知道怎么使用图片。 @MohdAzwan 这取决于很多事情,但是如果您有后端的 url,假设您将图像保存在名为images
的文件夹中,那么您可以像 @ 一样访问它987654323@ 或类似的东西。
我很确定代码在应用程序环境本身中,因为我已经在 pubspec.yaml 中使用资产。但是我想使用来自不同目录(如桌面或 htdocs)的图像,我正在尝试使用 C:\xampp\htdocs\foodsystem\uploads 等链接来访问图像,但工作室显示崩溃系统。【参考方案3】:
您实际上可以将图像存储在 MySQL 中。它的原始类型是BLOB。如果图像尺寸较小,这很有用,因为图像可以快速加载。如果图像大小很大,那么加载它的时间会很大,因此不建议这样做。存储图像路径仍然是一个更好的选择。
【讨论】:
【参考方案4】:是的,您可以将图像存储在数据库中,但我认为这是不可取的,也不是一般做法。
一般做法是将图像存储在文件系统的目录中,并将对图像的引用存储在数据库中。例如图像的路径、图像名称等。或者,您甚至可以将图像存储在内容交付网络 (CDN) 或跨越一些巨大物理区域的众多主机上,并将访问这些资源的引用存储在数据库中。
图像可以变得非常大,超过 1MB。因此,将图像存储在数据库中可能会给数据库以及数据库和 Web 服务器之间的网络带来不必要的负载(如果它们位于不同的主机上)。
您需要保存为 blob,mysql 中的 LONGBLOB 数据类型可以工作。
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 中使用 Flutter 和 php 上传图片的主要内容,如果未能解决你的问题,请参考以下文章
如何在flutter中使用mysql数据库(或json)中的sharedpreferences键选择以列出最喜欢的记录?
使用 PHP Mysql Flutter 用户特定的推送通知