欢迎大家。
这是我遇到的问题: 我正在尝试使用PHP和CURL将文件数据发送到服务器。 服务器接受6张照片的数据。 如果$ _FILES数组中的项目少于6个 - 那就错了。
所以,如果我发送所有6张照片,一切都很顺利。 但如果照片较少,则空照片的值会转到$ _POST数组。
我阅读了Curl文档但却找不到这种可能性。 如何使用CURL发送文件类型的空值?
答案 0 :(得分:1)
我不认为这是可能的:在浏览器中,根本不会将未使用的文件输入附加到请求,因此没有要解析的“空文件字段”值。
当PHP收到携带上传文件的请求时, $_FILES
将由PHP构建。
不确定你在这里尝试做什么 - 如果你没有首先发送六张图片,你是不是已经知道请求会失败?
答案 1 :(得分:1)
我有同样的问题,这有效:
curl -F "file_1=@files.zip" -F "file_2=@/dev/null;filename=" -F "file_3=@/dev/null;filename="
答案 2 :(得分:0)
我遇到了同样的问题。我的 PHP解决方案是像浏览器那样发送数据。只是尝试使用示例1:
示例1
$postData = '------WebKitFormBoundarywPZdrW1CWvlHZ7xB
Content-Disposition: form-data; name="image[3]"; filename=""
Content-Type: application/octet-stream
------WebKitFormBoundarywPZdrW1CWvlHZ7xB--';
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
工作正常吗?现在我们需要一些功能来自动构建这些数据。 示例2 是如何使用 CurlHelper :: prepareMultiPartData()函数进行简单说明。您需要先创建类 CurlHelper (下面列出的代码)。
示例2
$data=array( //array can be multidimensional like this
'image' => array(
3 => curl_file_create('', '', ''),
),
);
$boundary = 'webkit';
$postData = CurlHelper::prepareMultiPartData($data, $boundary);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'url');//TODO set your own url
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: multipart/form-data; boundary=$boundary"));
$response = curl_exec($ch);
类CurlHelper
class CurlHelper {
/**
* @param array $data POST data. could be multidimensional array
* @param string $boundary if $boundary == '' it will be generated automatically
* @return string formatted POST data separeted with boundary like in browser.
*/
static function prepareMultiPartData($data, &$boundary){
$boundary = self::_createBoundary($boundary);
$boundaryMiddle = "--$boundary\r\n";
$boundaryLast = "--$boundary--\r\n";
$res = self::_prepareMultipartData($data, ["\r\n"]);
$res = join($boundaryMiddle, $res) . $boundaryLast;
return $res;
}
static private function _createBoundary($boundaryCustom = '') {
switch ($boundaryCustom) {
case '':
return uniqid('----').uniqid();
case 'chrome':
case 'webkit':
return uniqid('----WebKitFormBoundary').'FxB';
default:
return $boundaryCustom;
}
}
static private function _prepareMultipartData($data, $body, $keyTpl = ''){
$ph = '{key}';
if ( !$keyTpl ) {
$keyTpl = $ph;
}
foreach ($data as $k => $v) {
$paramName = str_replace($ph, $k, $keyTpl);
if ( (class_exists('CURLFile') && $v instanceof \CURLFile) || strpos($v, '@') === 0 ) {
if (is_string($v)) {
$buf = strstr($v,'filename=');
$buf = explode(';', $buf);
$filename = str_replace('filename=', '', $buf[0]);
$mimeType = (isset($buf[1])) ? str_replace('type=', '', $buf[1]) : 'application/octet-stream';
} else {
$filename = $v->name;
$mimeType = $v->mime;
}
$str = 'Content-Disposition: form-data; name="' . $paramName . '"; filename="' . $filename . "\"\r\n";
$str .= 'Content-Type: ' . $mimeType . "\r\n\r\n\r\n";
$body[] = $str;
} elseif ( is_array($v) ) {
$body = self::_prepareMultipartData($v, $body, $paramName.'['.$ph.']');
} else {
$body[] = 'Content-Disposition: form-data; name="' . $paramName . "\"\r\n\r\n" . $v . "\r\n";
}
}
return $body;
}
}
答案 3 :(得分:0)
这是您始终可以发送文件输入字段的方法,即使它为空:
<input type="text" name="team_logo" hidden>
<input type="file" name="team_logo">
我不熟悉 curl,但这适用于 php laravel。