如何使用PHP接收通过POST请求提交的图像(文件)


How to recieve an image (file) with PHP that was submitted over a POST request

我有一个文件:success.jpg

我想通过HTTPPOST请求发送这个文件,并将它放在服务器上的公共目录中。

我有一个简单的HTML表单和PHP处理器,如果我从浏览器上传,它可以工作:PHP.net/manual/en/features.file-upload.post-method.PHP

我试图完全放弃表单的使用,只通过POST将数据传递到URL(例如myimageserver.com/public/upload.php)

我似乎可以使用PHP函数move_uploaded_file,它甚至在这里谈到了使用POST:http://php.net/manual/en/function.move-uploaded-file.php但它没有提供可以接收和存储已经用POST上传的文件的代码。

有人做过类似的事情吗?

例如,如果你想使用移动应用程序上传,你必须通过POST发送带有mimetype或其文件扩展名的图像的base64内容,然后使用类似的东西:

  • 发送base64编码和url转义的内容
  • 接收内容并进行base64解码,然后进行url解码

然后在PHP中只需执行:

<?php
$base64decodedString = base64_decode(urldecode($_POST['yourInputString']));
$fileName = $_POST['fileNameString']; 
file_put_contents($fileName, $base64decodedString);

这将生成一个内容为的文件

您可以阅读此示例http://www.w3schools.com/php/php_file_upload.asp

它基本上是这样做的:

<?php
$target_dir = "uploads/";
$target_dir = $target_dir . basename( $_FILES["uploadFile"]["name"]);
$uploadOk=1;
if (move_uploaded_file($_FILES["uploadFile"]["tmp_name"], $target_dir)) {
    echo "The file ". basename( $_FILES["uploadFile"]["name"]). " has been uploaded.";
} else {
    echo "Sorry, there was an error uploading your file.";
}

密钥位于$_FILES全局数组上。

要在应用该示例之前检查是否存在错误,可以使用以下示例:

if ($_FILES['file']['uploadFile'] === UPLOAD_ERR_OK) { 
/**
* Do the upload process mentioned above
**/
} else { 
/**
* There were an error
**/ 
} 

这是上传文件的基本HTML表单

<form action="" method="POST" enctype="multipart/form-data"> 
<input type="file" name="myFile" /> 
<input type="submit" value="Send" /> 
</form>

如何上传您的文件?

<?php
$uploaddir = '/www/uploads/'; //physical address of uploads directory
$uploadfile = $uploaddir . basename($_FILES['myFile']['name']);
if(move_uploaded_file($_FILES['myFile']['tmp_name'], $uploadfile)){
  echo "File was successfully uploaded.'n";
  /* Your file is uploaded into your server and you can do what ever you want with */
}else{
  echo "Possible file upload attack!'n";
}
?>

一些细节-如何获取上传目录的物理地址?只需在上传目录中创建一个索引文件并运行以下代码

<?php echo getcwd();?>

已经完成了,如果你需要更多的细节,请随时询问。

这也是最基本的方法。