php - 我如何上传文件 Curl PHP
问题描述
我正在尝试使用 Curl 和 PHP 发布文件。
我有以下说明:
提交文件
上传文件(用于存款或批量查询)使用带有 encType 的 HTTPs POST 提交:multipart/form-data。所有提交的 URL 是 https://doi.crossref.org/servlet/deposit。您也可以使用https://test.crossref.org/servlet/deposit将提交的内容发布到我们的测试系统。
使用 curl 的示例:
要上传文件:
curl -F 'operation=doQueryUpload' -F 'login_id=USERNAME' -F 'login_passwd=PASSWORD' -F 'fname=@FILENAME' https://doi.crossref.org/servlet/deposit
这是我正在尝试的代码
<?php
ini_set('display_errors', E_ALL);
define('CROSSREF_API_URL', 'https://test.crossref.org/servlet/deposit');
define('CROSSREF_API_DEPOSIT_OK', 303);
define('CROSSREF_API_RESPONSE_OK', 200);
echo registerDoi(realpath('test.xml'));
function registerDoi($filename) {
$curlCh = curl_init();
curl_setopt($curlCh, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curlCh, CURLOPT_POST, true);
curl_setopt($curlCh, CURLOPT_HEADER, 1);
curl_setopt($curlCh, CURLOPT_BINARYTRANSFER, true);
$username = 'username';
$password = '123456';
curl_setopt($curlCh, CURLOPT_URL, CROSSREF_API_URL);
curl_setopt($curlCh, CURLOPT_USERPWD, "$username:$password");
// Transmit XML data.
assert(is_readable($filename));
$fh = fopen($filename, 'rb');
$httpheaders = array();
$httpheaders[] = 'Content-Type: application/vnd.crossref.deposit+xml';
$httpheaders[] = 'Content-Length: ' . filesize($filename);
curl_setopt($curlCh, CURLOPT_HTTPHEADER, $httpheaders);
curl_setopt($curlCh, CURLOPT_INFILE, $fh);
curl_setopt($curlCh, CURLOPT_INFILESIZE, filesize($filename));
$response = curl_exec($curlCh);
if ($response === false) {
$result = 'response from server.';
} elseif ( $status = curl_getinfo($curlCh, CURLINFO_HTTP_CODE) != CROSSREF_API_DEPOSIT_OK ) {
$result = $response;
} else {
// Deposit was received
$result = 'recebido';
}
curl_close($curlCh);
return $result;
}
?>
这是错误:
HTTP/1.1 405 Method Not Allowed 服务器:Apache-Coyote/1.1 Crossref-Deployment-Name:cs3-1 Content-Type:text/plain;charset=UTF-8 Content-Language:en-US Content-Length:17 日期: 2018 年 5 月 10 日星期四 17:18:10 GMT 连接:关闭 Strict-Transport-Security: max-age=15768000 GET not supported
知道如何放置这个文件吗?
编辑
我按照@waterloomatt 的说明进行操作,现在又遇到了另一个错误
这是代码:
<!DOCTYPE html>
<html>
<body>
<form action="deposito.php" method="post" name="frmUpload" enctype="multipart/form-data">
<tr>
<td>Upload</td>
<td align="center">:</td>
<td><input name="file" type="file" id="file"/></td>
</tr>
<tr>
<td> </td>
<td align="center"> </td>
<td><input name="btnUpload" type="submit" value="Upload" /></td>
</tr>
</body>
</html>
<?php
if (isset($_POST['btnUpload']))
{
$url = "https://test.crossref.org/servlet/deposit";
$filename = $_FILES['file']['name'];
$filedata = $_FILES['file']['tmp_name'];
$filesize = $_FILES['file']['size'];
$username = 'usename';
$password = '1234';
if ($filedata != '')
{
$headers = array("Content-Type:multipart/form-data"); // cURL headers for file uploading
$postfields = array("filedata" => "@$filedata", "fname" => $filename);
$ch = curl_init();
$options = array(
CURLOPT_URL => $url,
CURLOPT_HEADER => true,
CURLOPT_POST => 1,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $postfields,
CURLOPT_INFILESIZE => $filesize,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERPWD => "$username:$password",
CURLOPT_BINARYTRANSFER => true
); // cURL options
curl_setopt_array($ch, $options);
$errmsg = curl_exec($ch);
curl_close($ch);
}
else
{
$errmsg = "Please select the file";
}
echo $errmsg;
}
错误信息:
HTTP/1.1 100 继续 HTTP/1.1 401 未经授权的服务器:Apache-Coyote/1.1 Crossref-Deployment-Name:cs3-1 Set-Cookie:JSESSIONID=B2110CC01E3542D50E21D9898D4FD5F2;Path=/ Content-Type: text/plain;charset=UTF-8 Content-Language: en-US Content-Length: 24 Date: Mon, 14 May 2018 13:10:07 GMT Connection: close Strict-Transport-Security: max-age=15768000 请求中没有登录信息
有谁知道为什么无法识别登录名和密码?
解决方案
我有同样的问题。我做了什么:
首先,将 URL 作为参数添加到curl_init
$ch = curl_init($url);
其次,使用类CURLFile而不是@。
最后,不是 CURLOPT_USERPWD 而是像这样发送凭据。
$postfields = array(
'login_id' => $username,
'login_passwd' => $password,
'fname' => new CURLFile($filedata),
);
推荐阅读
- python-3.x - 无法使用 Selenium-Python 打开 TOR
- android - 在 recyclerview 上更改方向期间再次从 Internet 加载数据
- javascript - 移动 iOS 和 Android Safari/Chrome 之间的 JavaScript 差异
- android - Android应用程序随机关闭而没有任何错误
- android - Flutter - 返回自定义对象的 PlatformChannel 绑定方法
- php - 如何在循环后重置变量 a、b、c 和得分?
- android-studio - 如何在 Android Studio 3.4 中导入第三方二进制库?
- powerbi - 具有简单事实表的关系日历不显示日期
- apache - (Apache + SVN) 基于组/IP 的身份验证/授权
- python - 如何读取、编辑、合并和保存一个文件夹中的所有 csv 文件?