将命令行cURL转换为PHP cURL

Bri*_*nte 33 php curl

我以前从未做过任何卷曲,所以需要一些帮助.我试图从例子中解决这个问题,但无法理解它!

我有一个curl命令,我可以从linux(ubuntu)命令行成功运行,该命令行通过api将文件放入wiki.

我需要将这个curl命令合并到我正在构建的PHP脚本中.

如何翻译此curl命令以使其在PHP脚本中工作?

curl -b cookie.txt -X PUT \
     --data-binary "@test.png" \
     -H "Content-Type: image/png" \    
     "http://hostname/@api/deki/pages/=TestPage/files/=test.png" \
     -0
Run Code Online (Sandbox Code Playgroud)

cookie.txt包含身份验证,但我在脚本中以明文形式显示它没有问题,因为这只会由我运行.

@ test.png必须是一个变量,例如$ filename

http:// hostname/@ api/deki/pages/= TestPage/files/=必须是一个变量,例如$ pageurl

谢谢你的帮助.

mik*_*iku 29

一个起点:

<?php

$pageurl = "http://hostname/@api/deki/pages/=TestPage/files/=";
$filename = "test.png";

$theurl = $pageurl . $filename;

$ch = curl_init($theurl);
curl_setopt($ch, CURLOPT_COOKIE, ...); // -b
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); // -X
curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); // --data-binary
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: image/png']); // -H
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); // -0

...
?>
Run Code Online (Sandbox Code Playgroud)

另见:http://www.php.net/manual/en/function.curl-setopt.php


kri*_*ris 15

你需要 ...

curl-to-PHP:https://incarnate.github.io/curl-to-php/

"立即将curl命令转换为PHP代码"

  • 但是,它并未涵盖所有可用的 curl 选项——有关 curl 选项的 PHP 标志的完整列表,请参见:http://php.net/manual/en/function.curl-setopt.php (2认同)

mar*_*rio 8

这是一个自动生成的列表,其中列出了哪些curl 命令行选项可能映射到哪些 php CURLOPT_ 常量:

--arg 描述 curl_setopt()
-a
--append
上传时附加到目标文件 CURLOPT_FTPAPPEND, CURLOPT_APPEND
--basic 使用 HTTP 基本身份验证 CURLAUTH_BASIC
--cacert <file> 用于验证对等方的 CA 证书 CURLE_SSL_CACERT, CURLE_SSL_CACERT_BADFILE
--capath <dir> 用于验证对等方的 CA 目录 CURLOPT_CAPATH
-E
--cert <certificate[:password]>
客户端证书文件和密码 CURLOPT_SSLCERT, CURLOPT_SSLCERTPASSWD, CURLOPT_SSLCERTTYPE, CURLE_SSL_CACERT, CURLE_SSL_CERTPROBLEM, CURLE_SSL_PEER_CERTIFICATE, CURLE_SSL_CACERT_BADFILE, CURLOPT_ISSUERCERT, CURLINFO_CERTINFO,CURLOPT_CERTINFO
--connect-to <HOST1:PORT1:HOST2:PORT2> 连接到主机 CURLOPT_CONNECT_TO
-b
--cookie <data>
从字符串/文件发送 cookie CURLOPT_COOKIE, CURLOPT_COOKIEFILE, CURLOPT_COOKIEJAR, CURLOPT_COOKIESESSION, CURL_LOCK_DATA_COOKIE, CURLINFO_COOKIELIST,CURLOPT_COOKIELIST
--crlf 上传时将 LF 转换为 CRLF CURLOPT_CRLF, CURLOPT_CRLFILE
--crlfile <file> 从给定文件中获取 PEM 格式的 CRL 列表 CURLOPT_CRLFILE
-d
--data <data>
HTTP POST 数据 CURLOPT_READDATA, CURL_LOCK_DATA_COOKIE, CURL_LOCK_DATA_DNS,CURL_LOCK_DATA_SSL_SESSION
--delegation <LEVEL> GSS-API 委托权限 CURLGSSAPI_DELEGATION_FLAG, CURLGSSAPI_DELEGATION_POLICY_FLAG,CURLOPT_GSSAPI_DELEGATION
--digest 使用 HTTP 摘要式身份验证 CURLAUTH_DIGEST, CURLAUTH_DIGEST_IE
--dns-interface <interface> 用于 DNS 请求的接口 CURLOPT_DNS_INTERFACE
--dns-servers <addresses> 要使用的 DNS 服务器地址 CURLOPT_DNS_SERVERS
--engine <name> 要使用的加密引擎 CURLOPT_SSLENGINE, CURLOPT_SSLENGINE_DEFAULT, CURLE_SSL_ENGINE_NOTFOUND, CURLE_SSL_ENGINE_SETFAILED,CURLINFO_SSL_ENGINES
-f
--fail
HTTP 错误时静默失败(根本没有输出) CURLOPT_FAILONERROR, CURLE_FAILED_INIT, CURLE_FTP_PORT_FAILED, CURLE_HTTP_PORT_FAILED, CURLE_LDAP_SEARCH_FAILED, CURLE_SSL_ENGINE_SETFAILED, CURLE_FTP_SSL_FAILED,CURL_FNMATCHFUNC_FAIL
-F
--form <name=content>
指定多部分 MIME 数据 CURLE_FTP_WEIRD_227_FORMAT, CURLE_MALFORMAT_USER, CURLE_URL_MALFORMAT, CURLE_URL_MALFORMAT_USER,CURLM_CALL_MULTI_PERFORM
--ftp-account <data> 帐户数据字符串 CURLOPT_FTP_ACCOUNT
--ftp-alternative-to-user <command> 替换 USER [name] 的字符串 CURLOPT_FTP_ALTERNATIVE_TO_USER
-P
--ftp-port <address>
使用 PORT 而不是 PASV CURLE_FTP_PORT_FAILED
--ftp-skip-pasv-ip 跳过 PASV 的 IP 地址 CURLOPT_FTP_SKIP_PASV_IP
--ftp-ssl-ccc 认证后发送 CCC CURLOPT_FTP_SSL_CCC
-G
--get
将post数据放在URL中并使用GET CURLOPT_HTTPGET, CURLE_FTP_CANT_GET_HOST, CURLE_FTP_COULDNT_GET_SIZE,CURL_RTSPREQ_GET_PARAMETER
-I
--head
仅显示文档信息 CURLOPT_HEADER, CURLOPT_HEADERFUNCTION, CURLOPT_HTTPHEADER, CURLOPT_WRITEHEADER, CURLINFO_HEADER_OUT, CURLINFO_HEADER_SIZE, CURLHEADER_SEPARATE, CURLHEADER_UNIFIED, CURLOPT_HEADEROPT,CURLOPT_PROXYHEADER
-H
--header <header/@file>
将自定义标头传递给服务器 CURLOPT_HEADER, CURLOPT_HEADERFUNCTION, CURLOPT_HTTPHEADER, CURLOPT_WRITEHEADER, CURLINFO_HEADER_OUT, CURLINFO_HEADER_SIZE, CURLHEADER_SEPARATE, CURLHEADER_UNIFIED, CURLOPT_HEADEROPT,CURLOPT_PROXYHEADER
--http2 使用 HTTP 2 CURLOPT_HTTP200ALIASES, CURL_VERSION_HTTP2
--ignore-content-length 忽略远程资源的大小 CURLOPT_IGNORE_CONTENT_LENGTH
--interface <name> 使用网络接口(或地址) CURLOPT_INTERFACE, CURLOPT_DNS_INTERFACE
-6
--ipv6
将名称解析为 IPv6 地址 CURL_VERSION_IPV6
--key <key> 私钥文件名 CURLOPT_SSLKEY, CURLOPT_SSLKEYPASSWD, CURLOPT_SSLKEYTYPE, CURLE_SSL_PINNEDPUBKEYNOTMATCH, CURLOPT_SSH_PRIVATE_KEYFILE, CURLOPT_SSH_PUBLIC_KEYFILE, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, CURLOPT_KEYPASSWD, CURLSSH_AUTH_KEYBOARD, CURLSSH_AUTH_PUBLICKEY,CURLOPT_PINNEDPUBLICKEY
--krb <level> 安全地启用 Kerberos CURLOPT_KRB4LEVEL, CURLOPT_KRBLEVEL
--local-port <num/range> 强制对本地端口号使用 RANGE CURLINFO_LOCAL_PORT
-L
--location
跟随重定向 CURLOPT_FOLLOWLOCATION
--login-options <options> 服务器登录选项 CURLOPT_LOGIN_OPTIONS
--mail-auth <address> 原始电子邮件的发件人地址 CURLOPT_MAIL_AUTH
--mail-from <address> 来自这个地址的邮件 CURLOPT_MAIL_FROM
--mail-rcpt <address> 邮寄到这个地址 CURLOPT_MAIL_RCPT
--negotiate 使用 HTTP 协商 (SPNEGO) 身份验证 CURLAUTH_GSSNEGOTIATE, CURLAUTH_NEGOTIATE
-n
--netrc
必须阅读 .netrc 以获取用户名和密码 CURLOPT_NETRC, CURL_NETRC_IGNORED, CURL_NETRC_OPTIONAL, CURL_NETRC_REQUIRED,CURLOPT_NETRC_FILE
--netrc-file <filename> 为 netrc 指定 FILE CURLOPT_NETRC_FILE
--netrc-optional 使用 .netrc 或 URL CURL_NETRC_OPTIONAL
--noproxy <no-proxy-list> 不使用代理的主机列表 CURLOPT_NOPROXY
--ntlm 使用 HTTP NTLM 身份验证 CURLAUTH_NTLM, CURLAUTH_NTLM_WB
--ntlm-wb 将 HTTP NTLM 身份验证与 winbind 结合使用 CURLAUTH_NTLM_WB
--oauth2-bearer <token> OAuth 2 承载令牌 CURLOPT_XOAUTH2_BEARER
--pass <phrase> 私钥的密码短语 CURLOPT_SSLCERTPASSWD, CURLOPT_SSLKEYPASSWD, CURLE_BAD_PASSWORD_ENTERED, CURLE_FTP_USER_PASSWORD_INCORRECT, CURLE_FTP_WEIRD_PASS_REPLY, CURLFTPSSL_CCC_PASSIVE, CURLOPT_KEYPASSWD, CURLSSH_AUTH_PASSWORD, CURLOPT_PASSWORD, CURLOPT_PROXYPASSWORD,CURLOPT_TLSAUTH_PASSWORD
--path-as-is 不要挤压 .. URL 路径中的序列 CURLOPT_PATH_AS_IS
--pinnedpubkey <hashes> FILE/HASHES 用于验证对等方的公钥 CURLE_SSL_PINNEDPUBKEYNOTMATCH
--proto <protocols> 启用/禁用协议 CURLE_UNSUPPORTED_PROTOCOLCURLOPT_PROTOCOLSCURLOPT_REDIR_PROTOCOLSCURLPROTO_ALLCURLPROTO_DICTCURLPROTO_FILECURLPROTO_FTPCURLPROTO_FTPSCURLPROTO_HTTPCURLPROTO_HTTPSCURLPROTO_LDAPCURLPROTO_LDAPSCURLPROTO_SCPCURLPROTO_SFTPCURLPROTO_TELNETCURLPROTO_TFTPCURLPROTO_IMAPCURLPROTO_IMAPSCURLPROTO_POP3CURLPROTO_POP3SCURLPROTO_RTSPCURLPROTO_SMTPCURLPROTO_SMTPSCURLPROTO_RTMPCURLPROTO_RTMPECURLPROTO_RTMPSCURLPROTO_RTMPTCURLPROTO_RTMPTECURLPROTO_RTMPTSCURLPROTO_GOPHERCURLPROTO_SMBCURLPROTO_SMBSCURLOPT_DEFAULT_PROTOCOL
--proxy-service-name <name> SPNEGO 代理服务名称 CURLOPT_PROXY_SERVICE_NAME
-p
--proxytunnel
通过 HTTP 代理隧道操作(使用 CONNECT) CURLOPT_HTTPPROXYTUNNEL
--pubkey <key> SSH 公钥文件名 CURLE_SSL_PINNEDPUBKEYNOTMATCH
-Q
--quote
传输前向服务器发送命令 CURLOPT_POSTQUOTE, CURLOPT_PREQUOTE, CURLOPT_QUOTE,CURLE_FTP_QUOTE_ERROR
--random-file <file> 用于读取随机数据的文件 CURLOPT_RANDOM_FILE
-r
--range <range>
仅检索 RANGE 内的字节 CURLOPT_RANGE, CURLE_HTTP_RANGE_ERROR,CURLOPT_LOCALPORTRANGE
-e
--referer <URL>
推荐网址 CURLOPT_AUTOREFERER, CURLOPT_REFERER
-X
--request <command>
指定要使用的请求命令 CURLOPT_CUSTOMREQUEST, CURLINFO_REQUEST_SIZE,CURLOPT_RTSP_REQUEST
--resolve <host:port:address[,address]...> 将host+port解析为这个地址 CURLE_COULDNT_RESOLVE_HOST, CURLE_COULDNT_RESOLVE_PROXY, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4, CURL_IPRESOLVE_V6, CURL_IPRESOLVE_WHATEVER,CURLOPT_RESOLVE
--retry <num> 如果出现暂时性问题,请重试请求 CURLFTP_CREATE_DIR_RETRY
--sasl-ir 在 SASL 身份验证中启用初始响应 CURLOPT_SASL_IR
--service-name <name> SPNEGO 服务名称 CURLOPT_PROXY_SERVICE_NAME, CURLOPT_SERVICE_NAME
--socks4 <host[:port]> 给定主机 + 端口上的 SOCKS4 代理 CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A
--socks4a <host[:port]> 给定主机 + 端口上的 SOCKS4a 代理 CURLPROXY_SOCKS4A
--socks5 <host[:port]> 给定主机 + 端口上的 SOCKS5 代理 CURLPROXY_SOCKS5, CURLPROXY_SOCKS5_HOSTNAME, CURLOPT_SOCKS5_GSSAPI_NEC,CURLOPT_SOCKS5_GSSAPI_SERVICE
--socks5-gssapi 为 SOCKS5 代理启用 GSS-API 身份验证 CURLOPT_SOCKS5_GSSAPI_NEC, CURLOPT_SOCKS5_GSSAPI_SERVICE
--socks5-gssapi-nec 与 NEC SOCKS5 服务器的兼容性 CURLOPT_SOCKS5_GSSAPI_NEC
--socks5-gssapi-service <name> GSS-API 的 SOCKS5 代理服务名称 CURLOPT_SOCKS5_GSSAPI_SERVICE

Vla*_*vic 7

您在命令行中拥有cURL,可以使用此工具将其转换为PHP:

https://incarnate.github.io/curl-to-php/
Run Code Online (Sandbox Code Playgroud)

经过长时间的寻找解决方案,它帮助了我!希望它也会帮助你!你的解决方案是:

// Generated by curl-to-PHP: http://incarnate.github.io/curl-to-php/
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://hostname/@api/deki/pages/=TestPage/files/=test.png");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$post = array(
    "file" => "@" .realpath("test.png")
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");


$headers = array();
$headers[] = "Content-Type: image/png";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢你:https://incarnate.github.io/curl-to-php/,我花了将近一天的时间来弄清楚如何正确设置标头 (2认同)

man*_*nny 6

试试这个:

$cmd='curl -b cookie.txt -X PUT \
     --data-binary "@test.png" \
     -H "Content-Type: image/png" \    
     "http://hostname/@api/deki/pages/=TestPage/files/=test.png" \
     -0';
exec($cmd,$result);
Run Code Online (Sandbox Code Playgroud)