0

我将纹理的原始字节 [] 发布到服务器,但在 sql 数据库中显示为 5B,当下载此数据时,文件为空。你能提供指导吗?

我将纹理的原始字节 [] 发布到服务器,如下所示:

byte [] imgByte0 = uploadedTex.GetRawTextureData();//uploadTex is Texture2D
Debug.Log("Byte Len " + imgByte0.Length);//results in 722160
WWWForm form = new WWWForm();;
form.AddBinaryData("rgbImgBytes", imgByte0, "image/png");
UnityWebRequest www = UnityWebRequest.Post("https:address.php", form);
yield return www.SendWebRequest();
我将它发布到我的 php 并插入到 sql 数据库 BLOB 中(我知道还有其他首选的替代方法来存储图像,imgs 是/将会非常小而不是这里的问题):

$thisRGBImg=$_FILES['rgbImgBytes'];
$stmt = $conn->prepare("INSERT INTO $imageTable `thisRGBImg` VALUES (?)");
$stmt->execute([$thisRGBImg];

Png 图像为 300Kb,但在 sql 数据库 BLOB 中显示为 5B。当我将这些原始字节下载到文件时,我进一步确认(根据https://thoughtbot.com/blog/avoiding-out-of-memory-crashes-on-mobile#streams-to-the-rescue)并且生成的文件是空的:

using (UnityWebRequest myWebRequest = UnityWebRequest.Post(path, formData2))
{
  myWebRequest.downloadHandler = new ToFileDownloadHandler(new byte[64 * 1024], savePathWithFileName);
  yield return myWebRequest.SendWebRequest();
}
public ToFileDownloadHandler(byte[] buffer, string filepath) : base(buffer)
    {
        this.filepath = filepath;
        fileStream = new FileStream(filepath, FileMode.Create, FileAccess.Write);
    }
protected override bool ReceiveData(byte[] data, int dataLength)
    {
        if (data == null || data.Length < 1)
        {
            Debug.Log("ReceiveData - received a null/empty buffer");
            return false;
        }
        received += dataLength;
        Debug.Log("Data received " + dataLength + " total received " + received);
        //if (!canceled) fileStream.Write(data, 0, dataLength);//replaced  for bw below
        if (!canceled)
        {
            var bw = new BinaryWriter(File.Open("path", FileMode.OpenOrCreate));
            bw.Write(data);
            bw.Flush();
            bw.Close();
        }
        return true;
    }

4

0 回答 0