通过cURL从PHP中的表单POST发送文件

2022-08-30 10:21:00

我正在编写一个API,并且我想处理来自表单的文件上传。表单的标记并不太复杂:POST

<form action="" method="post" enctype="multipart/form-data">
  <fieldset>
    <input type="file" name="image" id="image" />
    <input type="submit" name="upload" value="Upload" />
  </fieldset>
</form>

但是,我很难理解如何处理此服务器端并随cURL请求一起发送。

我熟悉使用带有数据数组的cURL发送请求,并且我在上传文件时阅读的资源告诉我在文件名前面加上符号。但这些相同的资源具有硬编码的文件名,例如POST@

$post = array(
    'image' => '@/path/to/myfile.jpg',
    ...
);

那么这是哪个文件路径?在哪里可以找到它?它是否类似于 ,在这种情况下,我的数组应如下所示:$_FILES['image']['tmp_name']$post

$post = array(
    'image' => '@' . $_FILES['image']['tmp_name'],
    ...
);

还是我以错误的方式行事?任何建议将不胜感激。

编辑:如果有人能给我一个代码片段,说明我将如何使用下面的代码片段,那么我将不胜感激。我主要追求的是我将作为cURL参数发送的内容,以及如何将这些参数与接收脚本一起使用的示例(为了参数的缘故,让我们称之为参数)。curl_receiver.php

我有这个网络表单:

<form action="script.php" method="post" enctype="multipart/form-data">
  <fieldset>
    <input type="file" name="image />
    <input type="submit" name="upload" value="Upload" />
  </fieldset>
</form>

这将是:script.php

if (isset($_POST['upload'])) {
    // cURL call would go here
    // my tmp. file would be $_FILES['image']['tmp_name'], and
    // the filename would be $_FILES['image']['name']
}

答案 1

以下是一些将文件发送到ftp的生产代码(对您来说可能是一个很好的解决方案):

// This is the entire file that was uploaded to a temp location.
$localFile = $_FILES[$fileKey]['tmp_name']; 

$fp = fopen($localFile, 'r');

// Connecting to website.
$ch = curl_init();

curl_setopt($ch, CURLOPT_USERPWD, "email@email.org:password");
curl_setopt($ch, CURLOPT_URL, 'ftp://@ftp.website.net/audio/' . $strFileName);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 86400); // 1 Day Timeout
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'CURL_callback');
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localFile));
curl_exec ($ch);

if (curl_errno($ch)) {

    $msg = curl_error($ch);
}
else {

    $msg = 'File uploaded successfully.';
}

curl_close ($ch);

$return = array('msg' => $msg);

echo json_encode($return);

答案 2

对于找到这篇文章并使用PHP5.5 +的人来说,这可能会有所帮助。

我发现netcoder建议的方法不起作用。即这不起作用:

$tmpfile = $_FILES['image']['tmp_name'];
$filename = basename($_FILES['image']['name']);
$data = array(
    'uploaded_file' => '@'.$tmpfile.';filename='.$filename,
);
$ch = curl_init();   
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

我会在var领域收到 - 而var中没有任何东西。$_POST'uploaded_file'$_FILES

事实证明,对于php5.5 +,您需要使用一个新功能。因此,上述内容将变为:curl_file_create()

$data = array(
    'uploaded_file' => curl_file_create($tmpfile, $_FILES['image']['type'], $filename)
);

由于该格式现已弃用。@


推荐