【问题标题】:Uploading a image to server using post PHP使用 post PHP 将图像上传到服务器
【发布时间】:2016-05-23 23:46:53
【问题描述】:

我计划开发一个图像上传 API,它需要将图像上传到服务器位置,作为我项目的一部分。 (用法是使用安卓应用上传用户照片和头像)

API 应该类似于Imgur API,我们可以在其中使用 post 请求将二进制图像上传到服务器。

我搜索了多个问题,得到的都是使用需要提交 html 表单的多部分请求。由于我的目标是创建 API,因此无法提交 html 表单。

无论如何,我正在提交一个使用 html 表单上传图像的示例代码。有人可以告诉我如何修改脚本以满足我的要求吗?

  <html>
          <body>

<form action="photo.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>
                </body>
                </html>

PHP 代码

<?php
$allow = array("jpg", "jpeg", "gif", "png");

$todir = 'uploads/';

if (!!$_FILES['file']['tmp_name'] ) // is the file uploaded yet?
{
    $info = explode('.', strtolower( $_FILES['file']['name']) ); // whats the extension of the file

    if ( in_array( end($info), $allow) ) // is this file allowed
    {
        if ( move_uploaded_file( $_FILES['file']['tmp_name'], $todir . basename($_FILES['file']['name'] ) ) )
        {
            // the file has been moved correctly
        }
    }
    else
    {
        // error this file ext is not allowed
    }
}
?>

【问题讨论】:

  • 语法是否有效!!$_FILES['file']['tmp_name']??双!!
  • 哎呀。纠正它。感谢您提供信息。
  • 等待“!!”我认为实际上更有意义,现在您似乎仅在没有文件上传时才运行验证代码。双重感叹“!!”只是将一个值转换为布尔值,因为它只是意味着错误的 fasle。所以它将接受一个变量并评估它的布尔值,然后应用一个逻辑'NOT',再次执行它只会将一个变量转换为布尔值,但由于它处于 if 条件下它无论如何都会完成,所以我不看到这里的重点。但是,在您编辑之后,它实际上看起来完全错误。
  • 这是有道理的。再次编辑我的代码。

标签: php html api post


【解决方案1】:

关于你的服务器端代码的一些评论,没有特定的顺序:

  • 正如您在Handling file uploads 所读到的,验证上传的正确方法是将['error'] 子键与UPLOAD_ERR_OK (codes explained here) 进行比较。不要为此使用['tmp_name']

  • 不要让最终用户选择您服务器上的实际文件名。您最好自己生成一个唯一的名称并将显示名称保留在其他地方(例如数据库)

  • 确定文件扩展名的推荐方法是pathinfo

    pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION)
    
  • 用户提供的文件扩展名不是确定文件类型的可靠方法。对于图片,经常使用getimagesize函数。

【讨论】:

    【解决方案2】:

    需要html表单提交的多部分请求

    错了。它需要格式正确的请求(标​​头和正文),句号。事实上,服务器无法知道是用什么软件来生成请求的——或者你是否只是自己在控制台中输入了字节;-)

    【讨论】:

    • 这很有趣。但是我只想表达我不能在我的情况下使用 HTML 表单提交。
    • 我的回答想表达你不需要。我很确定 Android SDK 提供了适当的库来生成 multipart/form-data 消息,而无需使用浏览器作为代理。无论如何,如果您的问题实际上与此无关,我建议您将其编辑出来,我很乐意删除我的答案。
    猜你喜欢
    • 2013-11-02
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多