【问题标题】:how to submit remote file from curl request as form data如何从 curl 请求提交远程文件作为表单数据
【发布时间】:2015-01-17 23:17:27
【问题描述】:

我的 PHP 应用程序设置为用户可以通过表单保存/上传文件。我正在尝试编写一个 shell 脚本(由 cron 作业运行),它重用相同的模型方法,但用于不通过表单提交的文件。我目前正在使用 curl 来获取文件,但我对其他解决方案持开放态度。

这是我目前获取文件的方式:

$ch = curl_init($image_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$photo_data = curl_exec($ch);
curl_close($ch);

这似乎返回 base64 编码数据...

Hâ6#Ý^¦Ó­¾ÊiAM¸¤¨q±´°jîÍrÓÄ¥!dqh/J°ØÉ(þ}ZKóܧóµßÅÑ  .JÍWE-uXؤu!¢
±IãJT æµ¯utÞfåã6MGâYØUL:ÑÆZS÷'5Óç;ªåÓÒâbmlLKsô«ÄT
±üåûü_ĦSSM"ºlDAº¦Ë]Xcç[)X©¬oÞÃîIöÁB]aR+%+å@_·]³
...

这是我的应用所期望的发布数据的格式:

[Photo] => Array
    (
        [file] => Array
            (
                [name] => desert2.jpg
                [type] => image/jpeg
                [tmp_name] => /Applications/MAMP/tmp/php/php65uUCk
                [error] => 0
                [size] => 96573
            )

    )

所以我的问题是如何使通常处理来自上述发布请求的数据的脚本可以访问curled 文件数据?

【问题讨论】:

  • PHP 内置了一个 base64_decode 函数。您必须将其解析为所需的格式。我现在正在使用手机,因此无法提供文档,但快速谷歌搜索应该会有所帮助。
  • 谢谢@JoeKasavage。我知道base64_decode 函数,但我仍然不确定在那之后该怎么做。如何将文件/数据放入 tmp 位置或 POST 文件通常结束的位置?
  • 文件是图像,您可以通过多种方式进行操作。您可以将 base64 转换为文件,或者我喜欢将字符串添加到数据库中并将图像/jpeg 添加到其中,如果您将该字符串放入图像源中,它将显示,或者您可以使用只链接到图片。
  • @JoeKasavage 我想我理解了一半。我还没有尝试过,但我想我了解如何解码数据并将其保存为文件。我仍然模糊的部分是如何使文件可以访问它的方法。我是否手动创建一个 tmp_name 并将其保存到 tmp 位置?我习惯于服务器设置基本上处理这些东西(在表单提交之后),所以我不知道如何重新创建它。如果你有机会,你能用一些示例代码,甚至只是伪代码提交答案吗?
  • 我可以过一会儿来写一篇完整的文章。希望一个小时左右,目前正在处理一些客户工作。我发现成为允许 blob 数据类型在 base64 中来回传递信息的 ajax 调用的最佳方式。

标签: php forms curl file-upload


【解决方案1】:

http://php.net/manual/en/function.fsockopen.php

<?php

// cURL
$ch = curl_init($image_url); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$photo_data = curl_exec($ch); 
curl_close($ch); 

// Create Image Array
$imageData = array(
                "name"=>"IMAGE NAME",
                "type"=>"image/jpeg",
                "tmp_name"=>"TEMP NAME",
                "error"=>0,
                "size"=>str_len($photo_data),
                "photo"=>$imageData // Add this line as there is nothing in the data structure given that will pass the image data
             );

// URL
$url = parse_url("http://www.wherethisisgoing.com/page.php");

$host = $url["host"];
$path = $url["path"];

$httpData = http_build_query($imageData); // Converts array to URL Parameters

$socket = fopensock($host, 80, $errno, $error, 30); // 80 is the port and 30 is the timeout length

if($socket) {
    fputs($socket, "POST " . $path . " HTTP/1.1\r\n");
    fputs($socket, "Host: " . $host . "\r\n");
    fputs($socket, "Referrer: PUT SENDING URL HERE\r\n");
    fputs($socket, "Content-type: application/x-www-form-urlencoded\r\n");
    fputs($socket, "Content-length " . strlen($imageData) . "\r\n");
    fputs($socket, "Connection: close\r\n\r\n");
    fputs($socket, $imageData);

    while(feof($socket)) {
        // Get Results
        $result .= fgets($socket, 128); // 128 should be enough to receive the response from the script
    }
} else {
    return array(
                    "status"=>"error",
                    "error"=>$error . " (" . $errno . ")" 
                );
}

//Do some type of checking to verify the image was uploaded

fclose($socket);

【讨论】:

    猜你喜欢
    • 2023-02-01
    • 2017-11-04
    • 2020-05-11
    • 2018-09-23
    • 2017-06-28
    • 2011-06-11
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    相关资源
    最近更新 更多