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

6
我有一个文件:success.jpg
我想通过HTTP POST请求发送此文件,并使其落入我的服务器上的公共目录中。
如果我从浏览器上传,我有一个简单的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上传的文件的代码” — 是的,它提供了!它标记为示例#1 - Quentin
“我正在尝试完全放弃使用表单,直接通过POST传递数据”——如果不是来自表单,那么数据将从哪里来? - Quentin
POST是一种请求方法,用于传递数据,虽然它主要与表单一起使用,但不需要表单的帮助。第一个示例未将文件传递到目录,响应为空,并且错误日志未显示任何内容。 - sparecycle
我知道什么是POST。我问你如果你不使用表单创建POST请求,你使用的是什么方法。你确定问题不是出在PHP上而是你使用的未指定的方法吗?你所说的“响应为空”是什么意思?示例1没有向浏览器输出任何内容,它只处理文件移动,所以除非你添加一些代码,否则响应应该是空的。如果错误日志没有显示任何内容,你尝试过增加PHP错误日志记录级别了吗? - Quentin
3个回答

4
如果您想使用移动应用程序上传文件,例如图片,您需要通过POST请求将其以base64编码的内容和mimetype或文件扩展名发送出去,然后像这样使用:

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

然后在PHP中只需执行:

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

这将生成一个包含内容的文件。

这绝对是好事。我会看看能否根据此实施。谢谢! - sparecycle

2
你可以阅读这个例子 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
**/ 
} 

好的,我感觉就是这样了。最后一个问题:我需要填充那个全局数组吗?还是当我上传文件时会自动完成?现在试一下... - sparecycle
2014/10/31 13:01:10 [错误] 18085#0: *1201 FastCGI在从上游读取响应头时发送了stderr:“PHP消息:PHP通知:在第3行的/usr/share/nginx/html/public/uploader.php中未定义索引:uploadFile PHP消息:PHP通知:在第6行的/usr/share/nginx/html/public/uploader.php中未定义索引:uploadFile”,请求为:“POST /sandbox/shawney/shawneyuploadv1.php HTTP/1.1”,上游:“fastcgi://unix:/var/run/php5-fpm.sock:” - sparecycle
还有两件事情:
  • 如果你的HTML文件输入名为“uploadFileInputName”,那么你可以通过$_FILES['uploadFileInputName']来访问它,在这个例子中是“uploadFile”。
  • 如果你的HTML表单具有属性<form enctype="multipart/form-data">,那么$_FILES将被填充,这是发送二进制数据到服务器所必需的,否则$_FILES将为空。
- Germanaz0
好的,那么为了绕过表单直接使用移动应用程序(或其他POST方法)上传文件,我需要一个HTML表单,这样是不可能的,对吗? - sparecycle
1
我刚刚用另一种解决方案回答了,希望对你有用。 - Germanaz0

1
这是用于上传文件的基本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();?>

如果您需要更多细节,请随时提问。

这只是基本的方法。


1- 抱歉,我没有理解你的需求。您是否想在不使用HTML表单的情况下自动上传文件? 2- $_FILES数组将在您的表单发送后立即定义。 - Bassem Rabia
没错,这是移动开发的常见做法,因为它需要在移动应用程序中安装FTP或SSH才能上传图像。使用HTTP POST利用了移动浏览器/操作系统中已经内置的功能。感谢您的建议。 - sparecycle
据我所知,现代手机使用的浏览器都非常出色。不客气 :D - Bassem Rabia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接