我一直在拼凑几件东西,但我遇到了一些障碍。这是我第一次尝试将图像保存到服务器。我包括到目前为止我已经完成的组件。 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 ''
答案 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