需要有关将图像保存到mySQL的指导

时间:2015-07-20 14:57:29

标签: php mysql image unity3d

我一直在拼凑几件东西,但我遇到了一些障碍。这是我第一次尝试将图像保存到服务器。我包括到目前为止我已经完成的组件。 cs脚本,php文件和我的表设置。现在我保存到服务器,但我得到空条目。有人可以告诉我如何在我的代码中正确设置吗?

如何转移'字节' (C#文件中的字节数组)到服务器并将其保存在'映像'团块?如何传递form.AddBinaryData参数并将它们存储在我创建的表中?

---------- C#----------

public string screenShotCGIURL= "https://locomoku.com/php/uploadSC.php";


public void TakeScreenshot() 
{ 
    StartCoroutine("UploadPNG"); 
}

IEnumerator UploadPNG()
{
    // We should only read the screen buffer after rendering is complete
    yield return new WaitForEndOfFrame();

    // Create a texture the size of the screen, RGB24 format
    int width = Screen.width;
    int height = Screen.height;
    Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);

    // Read screen contents into the texture
    tex.ReadPixels(new Rect(0, 0, width, height/2), 0, 0);
    tex.Apply();

    // Encode texture into PNG
    byte[] bytes = tex.EncodeToPNG();
    Object.Destroy(tex);

    // Create a Web Form
    WWWForm form = new WWWForm();

    string file_name = "animalmatch_" + System.DateTime.Now.ToString("MM-dd-yyyy_HH-mm-ss");
    file_name = file_name+".png";
    // ref_link_screenshot = s_name;

    Debug.Log(file_name);

    // Upload to a cgi script
    WWW upload = new WWW(screenShotCGIURL, form);

    form.AddField("image_id", "");
    form.AddField("image_type", "image/png");
    form.AddBinaryData("image", bytes, file_name, "image/png");
    form.AddField("image_size", bytes.Length);
    form.AddField("image_name", file_name);


    yield return upload;

    if (!string.IsNullOrEmpty(upload.error)) {
        print(upload.error);
    }
    else {
        print("Finished Uploading Screenshot");
    }

---------- PHP ----------

$db_host        =   "localhost";    // MySQL Host Name.

$db_user        =   "********";     // MySQL User Name.

$db_password    =   "********";     // MySQL Password.

$db_name        =   "********";     // MySQL Database Name.


$imgData = file_get_contents($filename);
$size = getimagesize($filename);

mysql_connect("$db_host", "$db_user", "$db_password");
mysql_select_db ("$db_name");

$sql = "INSERT INTO screenshot
    (image_id ,image_type ,image, image_size, image_name)
    VALUES
    ('', '{$size['mime']}', '{$imgData}', '{$size[3]}', 
     '{$_FILES['userfile']['name']}')";

mysql_query($sql);

---------- mySQL ----------

image_id        tinyint(6)  not null default '0',

image_type      varchar(25) not null default '',

image           largeblob   not null,

image_size      varchar(25) not null default '',

image_name      varchar(50) not null default ''

1 个答案:

答案 0 :(得分:1)

我在尝试将.png从Unity上传到我的数据库时遇到了同样的问题,但我找到了解决问题的方法。 跟我说我是这个东西的新手,所以我不确定这是否是完美的解决方案,但它有效:

你的C#脚本看起来很好。使用AddBinaryData上传-png看起来与我所做的类似。但是,这些条目从未在数据库中正确列出。 这是因为我们从PHP脚本的$ _FILES ['image']获得的是具有以下属性的数组

$_FILES['userfile']['name']
$_FILES['userfile']['tmp_name']
$_FILES['userfile']['size']
$_FILES['userfile']['type']

这些属性都不包含我们正在寻找的内容,对,只包含名称和类型的字符串等。所以我们必须打开一个文件流来提取我们的实际内容,即我们的png图像。

将以下内容添加到PHP代码中:

$tmpName  = $_FILES['image']['tmp_name'];

$fp      = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);

然后在SQL查询中添加$ content变量,如下所示:

$query = "INSERT INTO screenshot (Image) VALUES ('$content')";
mysqli_query($conn, $query) or die('Error, sql query failed');

This页面和一些威士忌帮助我解决了这个问题。希望如果我的解决方案与您正在寻找的解决方案不完全匹配,它也可以为您提供帮助。

祝你好运!

PS: 我看到你在php文件中使用数据库连接设置。像W3schools这样的许多网站仍然保持这种状态,但如果你运气不好,信息可能会泄漏。

您可以用以下代码替换该代码:

$config = parse_ini_file('../config/config.ini');

然后将 config.ini 保存在另一个无法访问的目录中,如下所示:

[database]
servername = ***
username = ***
password = ***
dbname = ***

PHP对ini文件有很好的支持。要使目录在Apache环境中不可访问,您可以直接添加.htaccess脚本:

Deny from all

DS