如何在 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 用户特定的推送通知

如何在 Flutter 中获取原生启动画面?

如何在 dart/flutter 中解码复杂的 json?

如何使用Flutter将数据SQLite(离线)发送到服务器MySQL?

如何使用Flutter Mailer包发送复杂的电子邮件