试图上传一个图像(得到发送作为一个字节[])到我的domainfolder/服务器在PHP


Trying to upload an image (that gets sent as a byte[]) to my domainfolder/server in PHP

使用当前代码,当我从前端发送字节[](和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比使用常规文件上传更容易一些。当然,这里有一些安全问题,比如检查我们从谁那里接收上传的文件,但那是另一个话题=)