通过Http将视频文件从Unity上传到Python

2024-10-03 06:27:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将视频文件从Unity客户端上载到python服务器,但是当我尝试使用Unity中的UnityWebRequest和python中的http模块进行上载时,服务器接收到无效的视频文件

我的问题是如何通过Http将视频文件从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()

Tags: toself服务器httpserverportwwwbody
2条回答

多亏了>;阿拉希扬穆罕默德酒店

我的问题是以字符串而不是字节数组的形式从Unity发送文件。 我已将python代码更改为Flask server,以便可以轻松地从post请求中获取文件,最后我得到了以下代码:

这是我在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()

我认为在将文件(任何扩展名)上传到服务器时,编码并不重要

寻找两件事:

  1. 检查您的本地视频文件和上载的视频文件是否具有相同的大小。如果它们不匹配,则表示您在上载进度时遇到问题。(Check here
  2. 您正在使用POST方法上载视频。这意味着整个文件将上载到服务器,然后python脚本可以在“body”变量上使用它。如果文件大小匹配,我建议您使用类似Flask的框架作为服务器端python脚本

相关问题 更多 >