You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将图片上传的cURL命令转为PHP代码?Request Payload是什么?

问题背景

你上传JPG图片时抓包得到了如下cURL命令:

curl "https://admin-official.line.me/11702069/home/api/objects" -H "Origin: https://admin-official.line.me" -H "Accept-Encoding: gzip, deflate, br" -H "Accept-Language: en-US,en;q=0.9,id;q=0.8,de-DE;q=0.7,de;q=0.6" -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36" -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBv1B9k1i89zlgjnA" -H "Accept: */*" -H "Referer: https://admin-official.line.me/11702069/home/send/" -H "Cookie: tzoffset=-420; _trmccid=6b030cba93d9db09; _ga=GA1.2.1058855825.1526457491; _gid=GA1.2.814129237.1526457491; ldsuid=CiDum1r75zWBJ3f7oLqRAg==; _trmcdisabled2=-1; _trmcuser=^{^\^"id^\^":^\^"^\"^}; _ga=GA1.3.1058855825.1526457491; _gid=GA1.3.814129237.1526457491; plack_session_localaccount=XXX; minesota=XXX; minesota2=XXX-jdT5f_x10ov7Re12NliQw_zFyIe9osY4oOOc2Rxdy1gMyBhXbKdPmnpA2LHB9VhvlqlL_4hkeSNQK5SgU; plack_session=6cd2e4790ae9990303ea54f7f35b305fba801dc0; _trmcsession=^{^\^"id^\^":^\^"b8ba0724^\",^\^"path^\":^\^"/11702069/home/send/^\",^\^"query^\":^\^"^\",^\^"time^\":1526735963213,^\^"_dice^\":0.09452730791211028^}; __try__=1526737592637; _trmcpage=/11702069/home/send/" -H "Connection: keep-alive" --data-binary ^"------WebKitFormBoundaryBv1B9k1i89zlgjnA^ Content-Disposition: form-data; name=^\^"file^\^"; filename=^\^"alpen.jpg^\"^ Content-Type: image/jpeg^ ^ ^ ------WebKitFormBoundaryBv1B9k1i89zlgjnA^ Content-Disposition: form-data; name=^\^"csrf_token^\"^ ^ vJiSf8AZPpAvqCp0JQtrNOMgrZRtrDpa1TEHbYLz^ ------WebKitFormBoundaryBv1B9k1i89zlgjnA--^ ^" --compressed

你尝试用curl转PHP工具失败,自行编写的PHP代码也无法正常运行:

<?php 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "https://admin-official.line.me/11702069/home/api/objects"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, array("file" => "@".realpath('test.jpg'), "csrf_token" => $split2[0])); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate'); 
$headers = array(); 
$headers[] = "Origin: https://admin-official.line.me"; 
$headers[] = "Accept-Encoding: gzip, deflate, br"; 
$headers[] = "Accept-Language: en-US,en;q=0.9,id;q=0.8,de-DE;q=0.7,de;q=0.6"; 
$headers[] = "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"; 
$headers[] = "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBv1B9k1i89zlgjnA"; 
$headers[] = "Accept: */*"; 
$headers[] = "Referer: https://admin-official.line.me/11702069/home/send/"; 
$headers[] = 'Cookie: tzoffset=-420; _trmccid=6b030cba93d9db09; _ga=GA1.2.1058855825.1526457491; _gid=GA1.2.814129237.1526457491; ldsuid=CiDum1r75zWBJ3f7oLqRAg==; _trmcdisabled2=-1; _trmcuser={"id":""}; _ga=GA1.3.1058855825.1526457491; _gid=GA1.3.814129237.1526457491; plack_session_localaccount=XXX; minesota=XXX; minesota2=XXX; plack_session=XXX; _trmcsession={"id":"b8ba0724","path":"/11702069/home/send/","query":"","time":1526735963213,"_dice":0.09452730791211028}; __try__=1526737592637; _trmcpage=/11702069/home/send/'; 
$headers[] = "Connection: keep-alive"; 
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); 
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
$result = curl_exec($ch); 
if (curl_errno($ch)) { 
    echo 'Error:' . curl_error($ch); 
} 
curl_close ($ch); 
echo $result; 
?>
正确的PHP转换代码

你的代码有两个核心问题导致无法运行:

  • 手动指定了Content-Type的boundary,但PHP的cURL会自动生成匹配的boundary,手动设置会导致请求体和头信息不匹配,服务器无法解析
  • 旧的@文件上传语法在PHP 5.5及以上版本已被废弃,应该使用CURLFile类来处理文件上传,兼容性和可靠性更好

修正后的代码如下:

<?php
// 替换为你的实际CSRF Token值
$csrfToken = 'vJiSf8AZPpAvqCp0JQtrNOMgrZRtrDpa1TEHbYLz';
// 替换为你的本地图片路径
$imagePath = realpath('test.jpg');

$ch = curl_init();

// 设置请求URL
curl_setopt($ch, CURLOPT_URL, 'https://admin-official.line.me/11702069/home/api/objects');
// 让cURL返回结果而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 设置为POST请求
curl_setopt($ch, CURLOPT_POST, true);

// 构建POST字段:用CURLFile处理文件上传
$postFields = [
    'file' => new CURLFile($imagePath, 'image/jpeg', 'alpen.jpg'),
    'csrf_token' => $csrfToken
];
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);

// 设置请求头:不要手动设置Content-Type,让cURL自动生成
$headers = [
    'Origin: https://admin-official.line.me',
    'Accept-Encoding: gzip, deflate, br',
    'Accept-Language: en-US,en;q=0.9,id;q=0.8,de-DE;q=0.7,de;q=0.6',
    'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
    'Accept: */*',
    'Referer: https://admin-official.line.me/11702069/home/send/',
    'Cookie: tzoffset=-420; _trmccid=6b030cba93d9db09; _ga=GA1.2.1058855825.1526457491; _gid=GA1.2.814129237.1526457491; ldsuid=CiDum1r75zWBJ3f7oLqRAg==; _trmcdisabled2=-1; _trmcuser={"id":""}; _ga=GA1.3.1058855825.1526457491; _gid=GA1.3.814129237.1526457491; plack_session_localaccount=XXX; minesota=XXX; minesota2=XXX-jdT5f_x10ov7Re12NliQw_zFyIe9osY4oOOc2Rxdy1gMyBhXbKdPmnpA2LHB9VhvlqlL_4hkeSNQK5SgU; plack_session=6cd2e4790ae9990303ea54f7f35b305fba801dc0; _trmcsession={"id":"b8ba0724","path":"/11702069/home/send/","query":"","time":1526735963213,"_dice":0.09452730791211028}; __try__=1526737592637; _trmcpage=/11702069/home/send/',
    'Connection: keep-alive'
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

// 启用响应压缩
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate, br');

// Cookie持久化设置(如果不需要可以注释)
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');

// 执行请求并处理结果
$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'CURL错误: ' . curl_error($ch);
} else {
    echo $result;
}

curl_close($ch);
?>
关于Request Payload的解释

简单来说,Request Payload就是HTTP POST请求中携带的实际数据内容,也就是请求体(Request Body)。

在你的场景中,使用的是multipart/form-data格式的Payload,它的结构特点是:

  • 用一个随机生成的boundary字符串作为分隔符,将不同的表单字段(比如文件、CSRF Token)分开
  • 每个字段都包含Content-Disposition头,用于说明字段名、文件名(如果是文件类型)
  • 文件字段还会附带Content-Type头,说明文件的MIME类型(比如image/jpeg)
  • 最后以--boundary--结尾,表示请求体结束

你抓包得到的cURL命令中,--data-binary后面的内容就是完整的Request Payload。PHP的cURL会自动帮你构建这个Payload,只要你正确传入POST字段(包括CURLFile对象),它会自动生成合适的boundary和各个字段的头信息,不需要手动拼接。

内容的提问来源于stack exchange,提问作者Andra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:20:33