Flutter / Dart - Post 文件到服务器上的目录和用户信息到 Mysql 数据库
Flutter / Dart - Post File to Directory on Server and User Info to Mysql Database
有什么好的方法可以将音频文件 post 保存到服务器的目录中,然后将用户 ID 和文件名插入到 Mysql 数据库中?
我试过使用 PHP 的 file_get_contents 和 file_put_contents 函数从 php://input 获取文件数据并放到服务器上。不幸的是,尽管该文件确实出现在目录中,但它的字节数为零。
有更好的方法吗?这是我调用的 Dart/Flutter 方法来发出 http post 请求;
import 'dart:async';
import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart';
Future<String> uploadAudio({String currentuserid, String audiotitle, String filepath}) async {
final serverurl = "http://example.com/audiotest2.php?userid=" + currentuserid + "&title=" + audiotitle;
var request = http.MultipartRequest('POST', Uri.parse(serverurl));
var multiPartFile = await http.MultipartFile.fromPath("audio", filepath, contentType: MediaType("audio", "mp4"));
request.files.add(multiPartFile);
request.send().then((result) async {http.Response.fromStream(result).then((response)
{
if (response.statusCode == 200)
{
print('response.body '+response.body);
}
return response.body;
});
});
}
这里是 audiopost.php(注意:这个不安全的 mysql 代码是临时的,只是为了让它工作,直到我学会正确准备 mysql 语句。):
<?php
header("Content-Type: audio/mp4");
require_once (dirname(__FILE__).'/PHP_Compat-1.6.0a3/Compat/Function/file_get_contents.php');
$link = mysqli_connect("xxx", "xxx", "xxx", "xxx");
$userid=$_GET['userid'];
$title=$_GET['title'];
$data = php_compat_file_get_contents('php://input');
$audioname = $userid."-talk".m4a";
$isql = "INSERT INTO audioposts (userid, audioname, title) VALUES ('$userid','$audioname','$title' )";
if (file_put_contents($audioname,$data)) {
if (filesize($audioname) != 0) {echo "Recording Saved.";
if (mysqli_query($link, $isql)){echo "Success record insert";} else {echo "Failed record insert";}
} else {echo "File is empty.";}
} else { echo "File transfer failed."; }
?>
这是我在 Android Studio 中从 flutter 中得到的响应;
response.body File is empty File transfer failed.
我在 PHP 日志中没有看到任何错误。
看来我根本不需要 PEAR 包。 PHP 中的 _FILES 函数插入得很好;
<?php
header("Content-Type: audio/mp4");
$link = mysqli_connect("xxx", "xxx", "xxx", "xxx");
$userid=$_GET['userid'];
$title=$_GET['title'];
$userSQL= "SELECT postcount FROM users WHERE id = '$userid'";
$postResult = $link->query($userSQL);
$audioid="";
if ($postResult->num_rows >= 0) {
while($row = $postResult->fetch_assoc()) {
$postcount = $row["postcount"];
$newpostcount = $postcount + 1;
$audioname = $userid."-talk-".$newpostcount.".m4a";
$usql = "UPDATE users SET postcount='$newpostcount' WHERE id='$userid'";
$isql = "INSERT INTO audioposts (userid, audioname, title) VALUES ('$userid','$audioname','$title' )";
if (isset($_FILES["audio"]) && $_FILES["audio"]["error"] == 0) {
$uploaddir = '/myuploadir/';
$uploadfile = $uploaddir . basename($_FILES['audio']['name']);
$oldname = $_FILES['audio']['name'];
if (move_uploaded_file($_FILES['audio']['tmp_name'], $uploadfile)) {echo "File was uploaded. \n";
if (rename($oldname, $audioname)) {echo $oldname." to ".$audioname."\n";
if (mysqli_query($link, $usql)){echo "Successful postcount update! \n";
if (mysqli_query($link, $isql)){$audioid = $link->insert_id; echo $audioid; } else {echo "Failed record insert";}
} else {echo "Failed postcount update";}
} else {echo "Rename failed";}
} else {echo "Upload failed";}
} else {echo "There's an error";}
}
}
?>
有什么好的方法可以将音频文件 post 保存到服务器的目录中,然后将用户 ID 和文件名插入到 Mysql 数据库中?
我试过使用 PHP 的 file_get_contents 和 file_put_contents 函数从 php://input 获取文件数据并放到服务器上。不幸的是,尽管该文件确实出现在目录中,但它的字节数为零。
有更好的方法吗?这是我调用的 Dart/Flutter 方法来发出 http post 请求;
import 'dart:async';
import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart';
Future<String> uploadAudio({String currentuserid, String audiotitle, String filepath}) async {
final serverurl = "http://example.com/audiotest2.php?userid=" + currentuserid + "&title=" + audiotitle;
var request = http.MultipartRequest('POST', Uri.parse(serverurl));
var multiPartFile = await http.MultipartFile.fromPath("audio", filepath, contentType: MediaType("audio", "mp4"));
request.files.add(multiPartFile);
request.send().then((result) async {http.Response.fromStream(result).then((response)
{
if (response.statusCode == 200)
{
print('response.body '+response.body);
}
return response.body;
});
});
}
这里是 audiopost.php(注意:这个不安全的 mysql 代码是临时的,只是为了让它工作,直到我学会正确准备 mysql 语句。):
<?php
header("Content-Type: audio/mp4");
require_once (dirname(__FILE__).'/PHP_Compat-1.6.0a3/Compat/Function/file_get_contents.php');
$link = mysqli_connect("xxx", "xxx", "xxx", "xxx");
$userid=$_GET['userid'];
$title=$_GET['title'];
$data = php_compat_file_get_contents('php://input');
$audioname = $userid."-talk".m4a";
$isql = "INSERT INTO audioposts (userid, audioname, title) VALUES ('$userid','$audioname','$title' )";
if (file_put_contents($audioname,$data)) {
if (filesize($audioname) != 0) {echo "Recording Saved.";
if (mysqli_query($link, $isql)){echo "Success record insert";} else {echo "Failed record insert";}
} else {echo "File is empty.";}
} else { echo "File transfer failed."; }
?>
这是我在 Android Studio 中从 flutter 中得到的响应;
response.body File is empty File transfer failed.
我在 PHP 日志中没有看到任何错误。
看来我根本不需要 PEAR 包。 PHP 中的 _FILES 函数插入得很好;
<?php
header("Content-Type: audio/mp4");
$link = mysqli_connect("xxx", "xxx", "xxx", "xxx");
$userid=$_GET['userid'];
$title=$_GET['title'];
$userSQL= "SELECT postcount FROM users WHERE id = '$userid'";
$postResult = $link->query($userSQL);
$audioid="";
if ($postResult->num_rows >= 0) {
while($row = $postResult->fetch_assoc()) {
$postcount = $row["postcount"];
$newpostcount = $postcount + 1;
$audioname = $userid."-talk-".$newpostcount.".m4a";
$usql = "UPDATE users SET postcount='$newpostcount' WHERE id='$userid'";
$isql = "INSERT INTO audioposts (userid, audioname, title) VALUES ('$userid','$audioname','$title' )";
if (isset($_FILES["audio"]) && $_FILES["audio"]["error"] == 0) {
$uploaddir = '/myuploadir/';
$uploadfile = $uploaddir . basename($_FILES['audio']['name']);
$oldname = $_FILES['audio']['name'];
if (move_uploaded_file($_FILES['audio']['tmp_name'], $uploadfile)) {echo "File was uploaded. \n";
if (rename($oldname, $audioname)) {echo $oldname." to ".$audioname."\n";
if (mysqli_query($link, $usql)){echo "Successful postcount update! \n";
if (mysqli_query($link, $isql)){$audioid = $link->insert_id; echo $audioid; } else {echo "Failed record insert";}
} else {echo "Failed postcount update";}
} else {echo "Rename failed";}
} else {echo "Upload failed";}
} else {echo "There's an error";}
}
}
?>