Я пытаюсь загрузить видеофайл с клиента Unity на сервер python, но когда я пытаюсь это сделать, файл, который я получаю на сервере, не является допустимым видеофайлом. Возможно, проблема в том, что в Unity и Python я пытаюсь использовать разные кодировки, но на самом деле я не знаю.
Это мой код в Unity:
IEnumerator StartUploadCoroutine()
{
// Show a load file dialog and wait for a response from user
yield return FileBrowser.WaitForLoadDialog(false, null, "Load File", "Load");
isOpen = false;
// Upload File to movie server
if (FileBrowser.Success)
{
StreamReader reader = new StreamReader(FileBrowser.Result);
StartCoroutine(UploadCoroutine(reader)); // upload file to server;
}
}
/* Upload the chosen video file to the movie server */
IEnumerator UploadCoroutine(StreamReader reader)
{
UnityWebRequest www = UnityWebRequest.Post(videoPlayerManager.GetServerIp() + ":" + port.ToString(), reader.ReadToEnd());
yield return www.SendWebRequest();
if (www.isNetworkError || www.isHttpError)
{
Debug.Log(www.error);
}
else
{
Debug.Log("Form upload complete!");
}
}
А это мой Python код:
from http.server import BaseHTTPRequestHandler, HTTPServer
class HandleRequests(BaseHTTPRequestHandler):
def do_POST(self):
'''Reads post request body'''
content_length = int(self.headers['Content-Length'])
body = self.rfile.read(content_length)
self.send_response(200)
self.end_headers()
outF = open("myOutFile.mp4", "wb")
outF.write(body)
host = "127.0.0.1"
port = 9999
HTTPServer((host, port), HandleRequests).serve_forever()
РЕДАКТИРОВАТЬ:
Моя проблема отправлял файл из Unity в виде строки вместо массива байтов. Я изменил свой python код на Flask сервер, чтобы я мог легко получить файл из почтового запроса.
Окончательный код:
Это мой код в Unity :
IEnumerator StartUploadCoroutine()
{
// Show a load file dialog and wait for a response from user
yield return FileBrowser.WaitForLoadDialog(false, null, "Load File", "Load");
isOpen = false;
// Upload File to movie server
if (FileBrowser.Success)
{
StartCoroutine(UploadCoroutine(FileBrowser.Result)); // upload file to server;
}
}
/* Upload the chosen video file to the movie server */
IEnumerator UploadCoroutine(string filePath)
{
WWWForm form = new WWWForm();
form.AddBinaryData("vidFile", File.ReadAllBytes(filePath));
UnityWebRequest www = UnityWebRequest.Post(videoPlayerManager.GetServerUrl(), form);
yield return www.SendWebRequest();
if (www.isNetworkError || www.isHttpError)
{
Debug.Log(www.error);
}
else
{
Debug.Log("Form upload complete!");
}
}
А это мой Python код:
import os
from flask import Flask, request, send_from_directory
from gevent.pywsgi import WSGIServer
IP = "127.0.0.1"
PORT = 9999
# set the project root directory as the static folder
app = Flask(__name__)
@app.route('/', methods=['POST'])
def DownloadFile():
# request.form to get form parameter
vidFile = request.files["vidFile"].read()
outF = open("myOutFile.mp4", "wb")
outF.write(vidFile)
return ''
if __name__ == "__main__":
http_server = WSGIServer((IP, PORT), app)
http_server.serve_forever()