[英]Flutter / Dart - Post File to Directory on Server and User Info to Mysql Database
有没有一种好方法可以将音频文件发布到服务器上的目录,然后将用户 ID 和文件名插入 Mysql 数据库?
我尝试使用 PHP 的 file_get_contents 和 file_put_contents function 从 php://input 获取文件数据并放到服务器上。 不幸的是,尽管该文件确实出现在目录中,但它的字节数为零。
有一个更好的方法吗? 这是我用来发出 http 发布请求的 Dart/Flutter 方法;
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 package。 PHP 中的 _FILES function 插入就好了;
<?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";}
}
}
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.