使用当前代码,当我从前端发送字节[](和imagename)时,我在日志"上传失败"中收到此回声。我有一个现有的文件夹在我的域名"photosFolder",我试图存储我的图像和它的imagename,我从前端发送。
我现在有点困惑如何使这项工作,所以我添加了一个move_uploaded_file,我经常看到当我谷歌这个问题。这是正确的方法吗?
这是我目前拥有的php代码。
<?php
$input = file_get_contents('php://input');
$value = json_decode($input, true);
if (!empty($value)) {
file_put_contents($value['photo_name'], base64_decode($value['photo_data']));
$image_name = $value['photo_name'];
$image_data = $value['photo_data'];
if(move_uploaded_file($image_data, "photosFolder/$image_name")) {
echo "image uploaded!";
}
else {
echo "upload failed";
}
}
?>
我像这样从我的前端发送我的byte []:
static public async Task<bool> createPhotoThree(string imgName, byte[] imgData) {
var httpClientRequest = new HttpClient();
var postData = new Dictionary<string, object>();
postData.Add("photo_name", imgName);
postData.Add("photo_data", imgData);
var jsonRequest = JsonConvert.SerializeObject(postData);
HttpContent content = new StringContent(jsonRequest, System.Text.Encoding.UTF8, "application/json");
var result = await httpClientRequest.PostAsync("http://myadress.com/test.php", content);
var resultString = await result.Content.ReadAsStringAsync();
return true;
}
假设我要发送一个1x1大小的透明gif。在现实生活中,这个gif的大小将是47字节。出于这个原因,我将像这样调用你的c#方法:
await createPhotoThree("transparent.gif", imgData);
其中imgData
是一个字节[47],包含了这47个字节的透明gif。
在这种情况下,在php
侧,我将从php://input
接收以下信息:
{"photo_data":"R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOwAAAAA=","photo_name":"transparent.gif"}
所以,我所需要做的只是$value = json_decode($input, true);
从该输入创建一个数组。然后,把收到的文件放在某个地方。在您的情况下,您需要像这样更改php
代码:
$input = file_get_contents('php://input');
$value = json_decode($input, true);
if (!empty($value)) {
$image_name = $value['photo_name'];
$image_data = base64_decode($value['photo_data']);
if(file_put_contents("photosFolder/$image_name", $image_data)) {
echo "image uploaded!";
} else {
echo "upload failed";
}
} else {
echo "json error";
}
move_uploaded_file()
只适用于常规文件上传,但要进行常规文件上传,就像浏览器一样,您需要设置HTTP头
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryz0vLt59InlueCCBI
并正确地形成POST-body,像这样:
------WebKitFormBoundaryz0vLt59InlueCCBI
Content-Disposition: form-data; name="uploaded_file"; filename="transparent.gif"
Content-Type: image/gif
<image content goes here>
------WebKitFormBoundaryz0vLt59InlueCCBI--
并从$_FILES
数组中使用它,在这种情况下,move_uploaded_file()
将按预期工作。
我认为,使用json
比使用常规文件上传更容易一些。当然,这里有一些安全问题,比如检查我们从谁那里接收上传的文件,但那是另一个话题=)