PHP 7.2 CURLFile 给出“无效文件名”警告

2024-02-10

我在使用 CURLFile 对象时遇到问题(curl_file_create)。我尝试了多种方法,但无论我尝试什么,我最终都会在日志文件中收到 PHP 警告,并且该文件在我的 cURL 调用中被忽略。

首先,一些信息:

  • PHP 7.2
  • 文件已确认存在并且可由 PHP/Apache 读取
  • php-curl 和相关 php 库是最新的
  • 这是对象内的一个片段,因此引用$this。所有变量都正确加载。
  • 这是我开始的另一个问题的延续,当缩小范围时,似乎与主要的原始主题(mailgun)无关。如果您愿意,可以在此 URL 中引用它,但我打算尽快结束该问题。使用 PHP cURL 的 Mailgun 附件 - 无 SDK https://stackoverflow.com/questions/54678804/mailgun-attachments-with-php-curl-no-sdk?noredirect=1#comment96147796_54678804
  • 请注意,在代码块中,我注释掉了尝试添加文件的其他几个变体 - 所有这些变体都会创建相同的警告/结果

代码块

$curl = curl_init();

$curlOpts = array(
    CURLOPT_POST => 1,
    CURLOPT_URL => $postUrl,
    CURLOPT_TIMEOUT => 20,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
    CURLOPT_USERPWD => 'api:' . $this->apiKey
);

$postFields = array(
    'from' => $email->from,
    'to' => $email->to,
    'subject' => $email->subject
);

if (strlen($email->cc) > 0) {
    $postFields['cc'] = $email->cc;
}

if (strlen($email->bcc) > 0) {
    $postFields['bcc'] = $email->bcc;
}

if (strlen($email->html) > 0) {
    $postFields['html'] = $email->html;
} else {
    $postFields['text'] = $email->text;
}

if (count($email->attachments) > 0) {
    // Curl attachments for < PHP5.5 not supported
    if (function_exists('curl_file_create')) {
        $curlOpts[CURLOPT_SAFE_UPLOAD] = 1; // for < PHP 7
        //$curlOpts[CURLOPT_HTTPHEADER] = array('Content-Type: multipart/form-data');
        //$postFields['attachment'] = curl_file_create($email->attachments[0]);
        for ($i = 1; $i <= count($email->attachments); $i++) {
            $postFields['attachment[' . $i . ']'] = curl_file_create($email->attachments[$i - 1], 'text/csv', basename($email->attachments[$i - 1]));
            //$postFields['attachment[' . $i . ']'] = curl_file_create('/var/www/sites/domain/contact.csv', 'text/csv', 'contact.csv');
            //$postFields['attachment[' . $i . ']'] = curl_file_create('test.txt', 'text/plain', 'test.txt');
            //$postFields['attachment[' . $i . ']'] = curl_file_create(realpath('test.txt'), 'text/plain', 'test.txt');
            //$postFields['attachment[' . $i . ']'] = new \CURLFile($email->attachments[$i - 1]);
        }
    } else {
        \D3DevelForms\Models\Error::CreateAndSaveSystemError(
            $plugin, 
            \D3DevelForms\Common::ERROR_WARNING, 
            'PHP 5.5 or newer required for Mailgun Attachments', 
            \D3DevelForms\Models\Error::ERROR_CODE_API_MAILGUN_LOCAL_ERROR,
            'You are using an outdated version of PHP. Email attachments via Mailgun will be ignored.');
    }
}

$curlOpts[CURLOPT_POSTFIELDS] = $postFields;

$log->UpdateDebugLog('Mailgun API Options', $curlOpts);

curl_setopt_array($curl, $curlOpts);

$curl_response = curl_exec($curl);
$info = curl_getinfo($curl);

卷曲选项 ($curlOpts)

Array
(
    [47] => 1
    [10002] => https://api.mailgun.net/v3/devtester.devtest.com/messages
    [13] => 20
    [19913] => 1
    [107] => 1
    [10005] => api:APIKEY
    [-1] => 1
    [10015] => Array
        (
            [from] => Dev Tester <[email protected] /cdn-cgi/l/email-protection>
            [to] => [email protected] /cdn-cgi/l/email-protection
            [subject] => Form Summary
            [text] => My Text Content
            [attachment[1]] => CURLFile Object
                (
                    [name] => /var/www/path_to/my_file.csv
                    [mime] => text/csv
                    [postname] => my_file.csv
                )

        )

)

返回的卷曲信息 ($info)

Array
(
    [url] => https://api.mailgun.net/v3/devtester.devtest.com/messages
    [content_type] => application/json
    [http_code] => 200
    [header_size] => 388
    [request_size] => 312
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.503718
    [namelookup_time] => 0.004273
    [connect_time] => 0.0932
    [pretransfer_time] => 0.279756
    [size_upload] => 1021
    [size_download] => 105
    [speed_download] => 208
    [speed_upload] => 2026
    [download_content_length] => 105
    [upload_content_length] => 1021
    [starttransfer_time] => 0.368725
    [redirect_time] => 0
    [redirect_url] => 
    [primary_ip] => Y.Y.Y.Y
    [certinfo] => Array
        (
        )

    [primary_port] => 443
    [local_ip] => X.X.X.X
    [local_port] => 38636
)

更新:当从命令行使用 cURL 进行测试时,它确实按预期工作,包括当我将其作为apache过程。

sudo -u apache curl -s --user 'api:APIKEY' \
    https://api.mailgun.net/v3/devtester.devtest.com/messages \
    -F from='Dev Tester <[email protected] /cdn-cgi/l/email-protection>' \
    -F to='[email protected] /cdn-cgi/l/email-protection' \
    -F subject='Hello' \
    -F text='Testing some Mailgun awesomness!' \
    -F attachment=@/var/www/path_to/my_file.csv
{
    "id": "<[email protected] /cdn-cgi/l/email-protection>",
    "message": "Queued. Thank you."
}

我在 Apache 日志中收到 PHP 警告,如下所示:

“PHP 警告:curl_setopt_array():密钥附件的文件名无效 [1]”

这很棘手,因为我已经确认了以下内容:

  • 文件存在
  • Apache 可以读取该文件
  • 文件路径不包含字母、数字、斜线和连字符之外的任何字符
  • 因为文件是在同一个线程内生成的,所以我尝试引用静态文件,但结果是相同的。

尤里卡。问题是使用curl_setopt_array。我能够像这样纠正这个问题:

//$curlOpts[CURLOPT_POSTFIELDS] = $postFields;

$log->UpdateDebugLog('Mailgun API Options', $curlOpts);

curl_setopt_array($curl, $curlOpts);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postFields);

我没有遇到任何关于此限制的文档curl_setopt_array,所以我不确定这是否是我的使用不当或者这是否是一个未知的错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 7.2 CURLFile 给出“无效文件名”警告 的相关文章

  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • Laravel 从 5.6 升级到 Laravel 6

    我有一个项目https github com javedbaloch4 Laravel Booking https github com javedbaloch4 Laravel Booking发展于Laravel 5 6现在我想将其升级到
  • 单词之间没有空格的语言(例如亚洲语言)中的断词?

    我想让 MySQL 全文搜索适用于日语和中文文本以及任何其他语言 问题在于这些语言以及可能其他语言通常在单词之间没有空格 当您必须键入与文本中相同的句子时 搜索没有用 我不能只在每个字符之间添加空格 因为英语也必须有效 我想用 PHP 或
  • 如何检查PHP变量是否包含非数字?

    我只是想知道检查 PHP 变量中是否有非数字的方法以及它是否也检测字符之间的空格 需要确保我的表单字段中没有添加任何奇怪的内容 提前致谢 如果您的意思是您只想要一个包含数字的值 那么您可以使用ctype digit http php net
  • 在 php 中为类自动生成 getter 和 setter 的最佳方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我经常创建一个包含一些私有变量的类 当设置此类的实例时 应该可以使用 getter 和 setter 填充该类的所有变量 有没有一种简单的方法可
  • FPDI/FPDF:水印和打印多页

    我修改了这个堆栈问题 当用户尝试下载文件时在 pdf 文件上应用水印 https stackoverflow com questions 3983432 applying watermarks on pdf files when users
  • 如何使用 php 发送服务器错误响应?

    一旦用户点击删除按钮我的 jQuery 脚本要求服务器删除所选项目 现在我想要我的php发送成功或错误响应的脚本 是否有可能触发错误回调万一该项目无法删除 Thanks 我的 jQuery 代码 ajax type post url myA
  • 从 smarty 访问 PHP 文件的变量(本地或全局)

    我有一个 php 文件 其中包含一些本地和全局变量 例如 foo 从此文件中调用 smarty 对象 如何在不更改 PHP 文件的情况下从 smarty 脚本访问 foo Thanks 如果你有一个名为 BASE 的常量变量 并且定义如下
  • Symfony2 Assetic 和 Less Sourcemaps

    我不确定如何破解 assetic less 过滤器以输出源映射文件 我这里指的是LessFilterhttps github com kriswallsmith assetic blob master src Assetic Filter
  • 从 .phar 存档中提取文件

    对于 Phar 文件 我完全错过了一些东西 我正在安装一个需要 phpunit pdepend 和其他依赖项的项目 我将它们作为 phar 文件获取 但是 我无法使用命令行工具 php 命令 从中提取文件 我用谷歌搜索了这个问题 但没有发现
  • 使用 SSL 证书验证 Web 浏览器

    是否可以使用 ssl 证书对 Web 浏览器进行身份验证 假设我在应用程序中存储私钥 有什么方法可以从浏览器读取密钥并尝试基于该私钥进行身份验证 您可以使用 SSL TLS 客户端证书身份验证来对浏览器 用户进行身份验证 服务器必须请求客户
  • PHP 脚本可以在终端中运行,但不能在浏览器中运行

    我正在尝试执行exec命令 但我遇到了问题 当我运行以下代码时 当我通过浏览器运行它时它不起作用 但如果我把输出 str将其复制并粘贴到终端中 它工作得很好 造成这种情况的原因是什么 我该如何解决 目前我正在运行localhost php
  • 在 PHP 中使用 phpseclib 时出现 RSA 问题

    我正在尝试在 phpseclib 中使用 RSA 实现 我认为在函数中执行一次代码并重新使用该函数会更容易 当我尝试向代码发送短信时 我收到一条错误消息 提示 解密错误 测试还让我意识到每次代码运行时密文都是不同的 所以我显然在那里做错了什
  • PHP preg_filter 返回意外的长值

    尝试在 Woocommerce 中删除标签并过滤值 但无法以正确的格式获取它 有东西有腥味 我正在使用WC gt cart gt get cart subtotal 来检索该值 在此示例中 我的值是 2 429kr 原始返回值是 span
  • jQuery Mobile 表单验证

    我有一个移动网站 除了验证之外一切都工作正常 基本上我希望从用户那里获取值 然后在单独的页面 process php 上处理它们 但是 在这样做之前 我需要检查以确保字段已填充 我已经研究了几种方法来做到这一点 但似乎没有一种有效 我现在有
  • 如果循环中内存超出,我可以在 for 循环中抛出异常吗?

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何处理 foreach 循环中发生
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • php 错误 fopen(): 文件名不能为空

    发送带有附件代码的电子邮件工作正常 最近我们已将文件传输到另一个托管服务器 idk 发生了什么 它显示以下错误 警告 fopen 第 106 行 home hugerecruitmetnt public html validatecva p
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐