如何使用 UnityWebRequest.Post(); 将多个文件上传到服务器;
How to Upload multiple files to a server using UnityWebRequest.Post();
我正在尝试使用 UnityWebRequest.Post() 上传多个文件,这是我的代码。
public void UploadFiles()
{
string[] path = new string[3];
path[0] = "D:/File1.txt";
path[1] = "D:/File2.txt";
path[2] = "D:/File3.txt";
UnityWebRequest[] files = new UnityWebRequest[3];
WWWForm form = new WWWForm();
for (int i = 0; i < files.Length; i++)
{
files[i] = UnityWebRequest.Get(path[i]);
form.AddBinaryData("files[]", files[i].downloadHandler.data, Path.GetFileName(path[i]));
}
UnityWebRequest req = UnityWebRequest.Post("http://localhost/File%20Upload/Uploader.php", form);
yield return req.SendWebRequest();
if (req.isHttpError || req.isNetworkError)
Debug.Log(req.error);
else
Debug.Log("Uploaded " + files.Length + " files Successfully");
}
然而,文件是在目标位置创建的,大小为 0 字节。
这是我的Uploader.php代码
<$php
$total = count($_FILES['files']['name']);
$uploadError = false;
for ( $i = 0; $i < $total; $i++)
{
$tmpFilePath = $_FILES['files']['tmp_name'][$i];
if ($tmpFilePath != "")
{
$newFilePath = "Uploads/".$_FILES['files']['name'][$i];
if (!move_uploaded_file($tmpFilePath, $newFilePath))
$uploadError = true;
}
}
if ($uploadError)
echo "Upload Error";
else
echo "Uploaded Successfully";
?>
我用这个HTML样本作为参考。在浏览器中 HTML 代码完美运行。 Unity 有问题。
<form enctype="multipart/form-data" action="Uploader.php" method="POST">
Choose a file to Upload:
<input type="file" name="files[]" multiple="multiple" /><br>
<input type="submit" value="Upload File" />
</form>
在for loop
中,在C#代码中,请求文件后,我们必须在获取文件时让步。所以在请求文件后使用 yield return files[i].SendWebRequest();
将解决问题。
这是修改后的代码:
IEnumerator UploadMultipleFiles()
{
string[] path = new string[3];
path[0] = "D:/File1.txt";
path[1] = "D:/File2.txt";
path[2] = "D:/File3.txt";
UnityWebRequest[] files = new UnityWebRequest[path.Length];
WWWForm form = new WWWForm();
for (int i = 0; i < files.Length; i++)
{
files[i] = UnityWebRequest.Get(path[i]);
yield return files[i].SendWebRequest();
form.AddBinaryData("files[]", files[i].downloadHandler.data, Path.GetFileName(path[i]));
}
UnityWebRequest req = UnityWebRequest.Post("http://localhost/File%20Upload/Uploader.php", form);
yield return req.SendWebRequest();
if (req.isHttpError || req.isNetworkError)
Debug.Log(req.error);
else
Debug.Log("Uploaded " + files.Length + " files Successfully");
}
其余代码没问题。 PHP 代码没有变化。 HTML代码仅供参考
我正在尝试使用 UnityWebRequest.Post() 上传多个文件,这是我的代码。
public void UploadFiles()
{
string[] path = new string[3];
path[0] = "D:/File1.txt";
path[1] = "D:/File2.txt";
path[2] = "D:/File3.txt";
UnityWebRequest[] files = new UnityWebRequest[3];
WWWForm form = new WWWForm();
for (int i = 0; i < files.Length; i++)
{
files[i] = UnityWebRequest.Get(path[i]);
form.AddBinaryData("files[]", files[i].downloadHandler.data, Path.GetFileName(path[i]));
}
UnityWebRequest req = UnityWebRequest.Post("http://localhost/File%20Upload/Uploader.php", form);
yield return req.SendWebRequest();
if (req.isHttpError || req.isNetworkError)
Debug.Log(req.error);
else
Debug.Log("Uploaded " + files.Length + " files Successfully");
}
然而,文件是在目标位置创建的,大小为 0 字节。
这是我的Uploader.php代码
<$php
$total = count($_FILES['files']['name']);
$uploadError = false;
for ( $i = 0; $i < $total; $i++)
{
$tmpFilePath = $_FILES['files']['tmp_name'][$i];
if ($tmpFilePath != "")
{
$newFilePath = "Uploads/".$_FILES['files']['name'][$i];
if (!move_uploaded_file($tmpFilePath, $newFilePath))
$uploadError = true;
}
}
if ($uploadError)
echo "Upload Error";
else
echo "Uploaded Successfully";
?>
我用这个HTML样本作为参考。在浏览器中 HTML 代码完美运行。 Unity 有问题。
<form enctype="multipart/form-data" action="Uploader.php" method="POST">
Choose a file to Upload:
<input type="file" name="files[]" multiple="multiple" /><br>
<input type="submit" value="Upload File" />
</form>
在for loop
中,在C#代码中,请求文件后,我们必须在获取文件时让步。所以在请求文件后使用 yield return files[i].SendWebRequest();
将解决问题。
这是修改后的代码:
IEnumerator UploadMultipleFiles()
{
string[] path = new string[3];
path[0] = "D:/File1.txt";
path[1] = "D:/File2.txt";
path[2] = "D:/File3.txt";
UnityWebRequest[] files = new UnityWebRequest[path.Length];
WWWForm form = new WWWForm();
for (int i = 0; i < files.Length; i++)
{
files[i] = UnityWebRequest.Get(path[i]);
yield return files[i].SendWebRequest();
form.AddBinaryData("files[]", files[i].downloadHandler.data, Path.GetFileName(path[i]));
}
UnityWebRequest req = UnityWebRequest.Post("http://localhost/File%20Upload/Uploader.php", form);
yield return req.SendWebRequest();
if (req.isHttpError || req.isNetworkError)
Debug.Log(req.error);
else
Debug.Log("Uploaded " + files.Length + " files Successfully");
}
其余代码没问题。 PHP 代码没有变化。 HTML代码仅供参考