如何将图片上传的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
相关产品推荐
相关产品推荐

