【问题标题】:PHP file upload and curlPHP文件上传和卷曲
【发布时间】:2011-06-07 14:35:41
【问题描述】:

我有一个问题。

我有一个处理文件上传的脚本,文件上传完成后,我通过 curl 将 $_FILES 数据发送到另一个本地脚本,该脚本处理文件并将其放置在适当的位置.

问题是,它在我的本地完美运行,使用以下 curl 设置:

curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

我运行 Windows 7,但是当我将脚本移动到我的专用服务器 (CentOS) 时,它停止工作。

经过一番研究,文件上传后,存放在/tmp目录下。

事实证明,上传到 /tmp 的文件在我的 curl 调用之前被删除。众所周知,一旦脚本执行完毕,PHP 会删除 tmp 文件上传。

有没有我可以在 CURL 中使用的设置来绕过这个问题?它在本地运行良好,我只是不明白为什么它不能在我的 CentOS 服务器上运行..

更新:它可以在我的另一台服务器上运行,该服务器也可以在 linux 上运行...我不知道更改它的具体设置是什么,但似乎每个服务器配置都是这一点不同。

【问题讨论】:

    标签: php linux curl centos


    【解决方案1】:

    因为您使用的是 CURL,所以您正在向 Web 服务器发送一个新请求。 您要求网络服务器做几件事:

    • 获取上传的文件
    • 处理脚本发送
    • 对 Web 服务器进程的新请求
    • 第二次请求

    与此同时,引擎知道它需要执行以下任务; 整理上传的文件

    不同的环境提供了以不同顺序处理这些任务的可能性(例如 Linux+Apache 与 Windows+IIS)。当它决定整理上传的文件时会解释你所看到的:

    • 获取上传的文件
    • 处理脚本发送
    • 对网络服务器的新请求
    • 处理第二个请求

    在第一个位置,您的脚本会中断,在第二个位置它将起作用。这是因为在第一次处理/运行您的第二个请求/脚本之前,您上传的文件已被删除。就像 Marc 提到的那样,这是核心功能,因此您需要修改脚本以使用 move_uploaded_file(),然后将文件的位置传递给您的其他脚本。

    希望这能阐明为什么它在不同环境中的运行方式不同。

    【讨论】:

    • 感谢您的详细回复,但无论如何我们可以避免这种情况吗?我看到 CURL 有很多选项,有没有办法让它持续存在?
    • 如果在您尝试使用 CURL 时文件不存在,则无法让 CURL 来“取消删除”该文件。另一件值得检查的事情是查看文件是否实际正在上传。您说在 CURL 调用之前它已被删除,但您确定它已正确上传吗?如果它实际上没有正确上传,这是一个不同的问题,您应该检查运行该服务的用户对您的 tmp 文件夹的写入权限。
    【解决方案2】:

    当原始上传完成时,您必须使用 move_uploaded_file() 将文件从 /tmp 移出到另一个目录,或者从同一脚本中启动 curl 上传。否则 PHP 将清理该文件,您无能为力。

    自动清理是 PHP 的核心功能,curl 不会影响它。

    【讨论】:

    • 我明白,但为什么它在我的本地工作?它也可以在不同的服务器上运行,但我不是系统管理员,所以我不能确定为什么......
    猜你喜欢
    • 2012-06-21
    • 2013-02-19
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2014-05-09
    • 2011-06-20
    • 2017-07-14
    相关资源
    最近更新 更多