Unityから画像データをPOSTし,httpサーバーにファイルとして保存する方法です.データベースは用いません.画像以外にも応用可能です.
環境
- クライアント側
- macOS Sierra 10.12.6
- Unity 5.6.3p2
- サーバー側
- CentOS Linux release 7.4.1708
- Apache/2.4.6
- PHP 7.1.5
- IPアドレスは192.168.0.10とします
クライアント側
FileUploader.cs
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using System.IO;
public class FileUploader : MonoBehaviour {
void Start() {
StartCoroutine (UploadFile ());
}
IEnumerator UploadFile() {
string fileName = "hoge.jpg";
string filePath = Application.dataPath + "/" + fileName;
// 画像ファイルをbyte配列に格納
byte[] img = File.ReadAllBytes (filePath);
// formにバイナリデータを追加
WWWForm form = new WWWForm ();
form.AddBinaryData ("file", img, fileName, "image/jpeg");
// HTTPリクエストを送る
UnityWebRequest request = UnityWebRequest.Post ("http://192.168.0.10/upload.php", form);
yield return request.Send ();
if (request.isError) {
// POSTに失敗した場合,エラーログを出力
Debug.Log (request.error);
} else {
// POSTに成功した場合,レスポンスコードを出力
Debug.Log (request.responseCode);
}
}
}
新メソッドのIMultipartFormSectionを使って実装したかったのですが,うまく動かなかったのでレガシーメソッドのWWWFormを使用しています.
とりあえず使ってみたい場合は,Assetsディレクトリ直下にhoge.jpgを配置し,FileUploader.csをMainCameraにアタッチして下さい.
サーバー側
upload.php
<?php
// アップロードされたファイルがjpeg形式か確認
if ($_FILES["file"]["type"] == "image/jpeg") {
if ($_FILES["file"]["error"] > 0) {
echo "Return Code:" . $_FILES["file"]["error"] . "";
} else {
echo "Upload:" . $_FILES["file"]["name"] . "";
echo "Type:" . $_FILES["file"]["type"] . "";
echo "Size:" . ($_FILES["file"]["size"] / 1024) . "Kb";
echo "Temp file:" . $_FILES["file"]["tmp_name"] . "";
// サーバー上に既にファイルが存在していないか確認
if (file_exists("upload/" . $_FILES["file"]["name"])) {
echo $_FILES["file"]["name"] . "already exists.";
} else {
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "Stored in:" . "upload/" . $_FILES["file"]["name"];
}
}
} else {
echo "Invalid file";
}
?>
Apacheのドキュメント・ルートは/var/www/html,アップロード先のディレクトリは/var/www/html/uploadとしています.アップロード先のディレクトリにはapacheの権限で書き込みができることが必要です.