从Oculus Quest上载到LAMP服务器时上载的文件为0字节

问题描述

我正在运行LAMP服务器以收集一些数据。我创建了一个Oculus Quest应用程序,该应用程序收集了一些数据,然后将其发布到LAMP服务器。在Quest上部署之前测试POST方法期间,我使用的是Unity和Windows。该方法效果很好,文件上传没有问题。

但是,当在Quest上部署此文件时,文件名将被上传并移动到目标目录,但是文件全为0字节。

我研究了潜在的问题,并相应地修改了我的PHP.ini文件。我增加了输入时间,最大文件大小,最大文件数等。我还检查了权限和error.log文件。里面没有错误

你们有什么想法吗?

统一代码:file_n是一个数组。它会从Quest的特定文件夹中读取所有文件名。

    IEnumerator UploadFile(string subID)
    {
        UnityWebRequest filetoUpload = new UnityWebRequest();
        WWWForm form = new WWWForm();

        filetoUpload = UnityWebRequest.Get(file_n);
        yield return filetoUpload.SendWebRequest();

        form.AddField("sub_ID",subID);
        form.AddBinaryData("files[]",filetoUpload.downloadHandler.data,Path.GetFileName(file_n));
        UnityWebRequest req = UnityWebRequest.Post(hostName,form);
        yield return req.SendWebRequest();

        if (req.isHttpError || req.isNetworkError)
        {
            Debug.Log(req.error);
        }
        else
        {
            Debug.Log(req.downloadHandler.text);
            result = req.downloadHandler.text;
            debugText.text = result;
        }
    }

PHP代码

<?PHP 

// Include the database configuration file 
include_once 'configFile.PHP'; 
     
// File upload configuration 
$targetDir = "targetDirectory/";  
$allowTypes = array('txt'); 
     
// variables submitted by user
$subID = $_POST["sub_ID"]; 

$statusMsg = $errorMsg = $insertValuessql = $errorUpload = $errorUploadType = ''; 
$fileNames = array_filter($_FILES['files']['name']);
if(!empty($fileNames)){ 
    foreach($_FILES['files']['name'] as $key=>$val){ 
        // File upload path 
        $fileName = basename($_FILES['files']['name'][$key]); 
        $targetFilePath = $targetDir . $fileName;             
         
        // Check whether file type is valid 
        $fileType = pathinfo($targetFilePath,PATHINFO_EXTENSION); 
        if(in_array($fileType,$allowTypes)){ 
            if(move_uploaded_file($_FILES["files"]["tmp_name"][$key],$targetFilePath)){ 
                $insertValuessql .= "('" .$subID. "','".$fileName."',Now()),"; 
            }else{ 
                $errorUpload .= $_FILES['files']['name'][$key].' | '; 
            } 
        }else{ 
            $errorUploadType .= $_FILES['files']['name'][$key].' | '; 
        } 
    } 

    if(!empty($insertValuessql)){ 
        $insertValuessql = trim($insertValuessql,','); 
         
        $insert = $conn->query("INSERT INTO thisTable (sub_ID,file_name,uploaded_on) VALUES $insertValuessql"); 
        if($insert){ 
            $errorUpload = !empty($errorUpload)?'Upload Error: '.trim($errorUpload,' | '):''; 
            $errorUploadType = !empty($errorUploadType)?'File Type Error: '.trim($errorUploadType,' | '):''; 
            $errorMsg = !empty($errorUpload)?'<br/>'.$errorUpload.'<br/>'.$errorUploadType:'<br/>'.$errorUploadType; 
            $statusMsg = "Files are uploaded successfully.".$errorMsg; 
        }else{ 
            $statusMsg = "Sorry,there was an error uploading your file."; 
        } 
    } 
}else{ 
    $statusMsg = 'Please select a file to upload.'; 
}      
// display status message 
echo $statusMsg; 
?>

解决方法

Quest使用Android系统。我通过更改此方法进行了修复:

fileToUpload = UnityWebRequest.Get(file_n);

对此:

fileToUpload = UnityWebRequest.Get("file:///" + file_n);

这告诉android传递到UnityWebRequest.Get()的uri是文件目的地,而不是主机。在Windows上,不必将其放入,因此会出现错误。感谢derHugo的帮助。