【问题标题】:Trying to upload an image (that gets sent as a byte[]) to my domainfolder/server in PHP尝试在 PHP 中将图像(以字节 [] 形式发送)上传到我的域文件夹/服务器
【发布时间】:2016-10-31 10:50:35
【问题描述】:

当我从前端发送字节 [](和图像名)时,使用当前代码,我在日志“上传失败”中收到此回显。 我的域上有一个名为“photosFolder”的现有文件夹,我尝试在其中存储我的图像及其从前端发送的图像名称。

我现在有点困惑如何完成这项工作,所以我添加了一个 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";
 }
}

?>

我像这样从前端发送我的字节 []:

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;
}

【问题讨论】:

  • 可能是文件大小错误,请阅读:stackoverflow.com/questions/9921224/…
  • 我使用域工作,但在“文件管理器”中找不到“htaccess 文件”。我是否需要与支持人员讨论您的想法并让他们更改此内容,或者 htaccess 文件是否应该存在于域文件中的某个地方?
  • 你对文件夹有写权限吗?
  • 如果你的意思是如果我可以制作和删除内容,比如新的 .php 文件和带有图像的文件夹,那么可以
  • var_dump(ini_get('upload_max_filesize'));给我 string(3) "96M" 所以它不是关于图像大小

标签: c# php


【解决方案1】:

假设我要发送一个 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 正文,如下所示:

------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 比使用常规文件上传要容易一些。 诅咒,这里我们有一些 sequrity 问题,比如检查我们从谁那里收到上传的文件,但这是另一个话题 =)

【讨论】:

  • 用那个 PHP 代码。 base64_decode 呢?我想我也需要实现它?
  • 操作...忘记那个。修正了我的答案
  • 例如,如果我没有图像名称,我可以自己制作一个吗?还是不行。所以把这个:"photosFolder/$image_name")改为这个:photosFolder/mynewcreatedphotoname.jpg。所以我创建自己的名字而不是图像的原始名称?现在 $image_name 变量不是图像名,它是图像路径,所以我想知道,因为现在使用该代码我得到“上传失败”。
  • 是的,您可以使用您在php 创建的图像名称。它会起作用的。如果您的$image_name 包含路径,则需要做额外的工作。喜欢:$dirname = dirname("photosFolder/$image_name"); mkdir($dirname, 0777, true);
  • 是的,我现在用一个简单的 basename () 得到了 image_name;但是我仍然无法使用您当前的代码上传失败。无论如何我可以看到为什么它没有被添加到这个里面:if(file_put_contents($image_data, "photosFolder/$image_name")) { echo "image uploaded!"; }
猜你喜欢
  • 2014-06-12
  • 2016-07-31
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
相关资源
最近更新 更多