繁体   English   中英

Flutter / Dart - 将文件发布到服务器上的目录和用户信息到 Mysql 数据库

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM