Почувствовав комфортное тестирование API Box через почтальона, я теперь пытаюсь запустить запросы curl из php-файла. Я могу запустить некоторые из них, но не могу понять, как преобразовать запрос загрузки файла, описанный в https://developers.box.com/docs/#files-upload-a-file.
Пример запроса, предоставленного по вышеуказанной ссылке:
curl https://upload.box.com/api/2.0/files/content \
-H "Authorization: Bearer ACCESS_TOKEN" -X POST \
-F attributes='{"name":"tigers.jpeg", "parent":{"id":"11446498"}}' \
-F [email protected]
Я написал следующее:
<?php
$folder_id = "2934811551"; //fake
$accessToken = "QxYtOeSUCdlu5PwMwxUJSD5BeMP9AaoZ"; //fake
$file_out = "\home\box\upload.json"; //store the JSON response
$file_up = "\home\box\uploadfile.txt"; //file to upload
$curl_url = 'https://upload.box.com/api/2.0/files/content';
$params = array('name' => '@' . $file_up,
'parent' => array('id' => $folder_id)
);
$params_json = json_encode($params);//execute CURL
$fp = fopen($file_out, "w"); //output file
$ch = curl_init();
$options = array(
CURLOPT_URL => $curl_url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => array("Authorization: Bearer " . $accessToken),
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $params_json,
CURLOPT_VERBOSE => true,
CURLOPT_FILE => $fp,
);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
print_r (curl_getinfo($ch));
echo curl_error($ch);
curl_close($ch);
fclose($fp);
?>
Результат:
* About to connect() to upload.box.com port 443 (#0)
* Trying 74.112.185.182... * connected
* Connected to upload.box.com (74.112.185.182) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* SSL connection using TLS_RSA_WITH_AES_256_CBC_SHA
* Server certificate:
* subject: CN=*.box.com,O="Box, Inc.",L=Los Altos,ST=California,C=US
* start date: Nov 13 19:22:20 2014 GMT
* expire date: Oct 23 02:42:03 2017 GMT
* common name: *.box.com
* issuer: CN=GeoTrust SSL CA - G4,O=GeoTrust Inc.,C=US
> POST /api/2.0/files/content HTTP/1.1
Host: upload.box.com
Accept: */*
Authorization: Bearer QxYtOeSUCdlu5PwMwxUJSD5BeMP9AaoZ
Content-Length: 55
Content-Type: application/x-www-form-urlencoded
< HTTP/1.1 405 Method Not Allowed
< Allow: GET, OPTIONS, HEAD
< Content-Type: text/html;charset=UTF-8
< Content-Length: 0
< Date: Thu, 29 Jan 2015 18:07:49 GMT
< Age: 0
< Connection: keep-alive
< Server: ATS
<
* Connection #0 to host upload.box.com left intact
Array
(
[url] => https://upload.box.com/api/2.0/files/content
[content_type] => text/html;charset=UTF-8
[http_code] => 405
[header_size] => 202
[request_size] => 255
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 5.748647
[namelookup_time] => 5.007004
[connect_time] => 5.155813
[pretransfer_time] => 5.544732
[size_upload] => 55
[size_download] => 0
[speed_download] => 0
[speed_upload] => 9
[download_content_length] => 0
[upload_content_length] => 0
[starttransfer_time] => 5.748583
[redirect_time] => 0
[certinfo] => Array
(
)
)
* Closing connection #0
Если я добавлю echo $params_json;
Я получил:
{"name":"@\\home\\dianna\\box\\uploadfile.txt","parent":{"id":"2934811551"}}
Если вместо строки в кодировке jkson CURLOPT_POSTFIELDS => $params_json,
Я передаю массив с CURLOPT_POSTFIELDS => $params,
я получил failed creating formpost data
, Если в этот момент я отредактирую переменную $ file_up, чтобы сохранить относительный URL для загружаемого файла ($file_up = "uploadfile.txt";
этот файл и мой файл php находятся в одной папке), вывод моего файла php становится:
Content-Length: 311
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------650eb8029292
* Done waiting for 100-continue
< HTTP/1.1 100 Continue
< Date: Thu, 29 Jan 2015 18:23:33 GMT
< Server: ATS
< HTTP/1.1 400 Bad Request
< server: ATS
< Date: Thu, 29 Jan 2015 18:23:34 GMT
< Cache-Control: no-cache, no-store
< Content-Type: application/json
< Content-Length: 277
< Age: 2
< Connection: keep-alive
<
* Connection #0 to host upload.box.com left intact
Array
(
[url] => https://upload.box.com/api/2.0/files/content
[content_type] => application/json
[http_code] => 400
[header_size] => 273
[request_size] => 260
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 7.698447
[namelookup_time] => 5.006963
[connect_time] => 5.154683
[pretransfer_time] => 5.540065
[size_upload] => 311
[size_download] => 277
[speed_download] => 35
[speed_upload] => 40
[download_content_length] => 277
[upload_content_length] => 311
[starttransfer_time] => 6.541224
[redirect_time] => 0
[certinfo] => Array
(
)
)
* Closing connection #0
Тип контента теперь установлен как multipart / form-data, но ответ по-прежнему равен 400.
Я прочитал все ответы по этой теме здесь, и страницу руководства по PHP-странице о curl, но это насколько я понял … (кстати, если это поможет, я использую PHP 5.3.3)
Любая помощь будет оценена!
Взгляните на это. Я успешно использовал его и обнаружил, что это лучший фреймворк для box-api и php https://github.com/golchha21/BoxPHPAPI
Это то, как я загружаю изображение, используя окно API.
$attributes = array('name'=>time().'.jpg','parent'=>array('id'=>$parent_id));
$params = array('attributes' => json_encode($attributes), 'file' => "@".realpath($filename));
$headers = array("Authorization: Bearer ".$accesstoken);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
$data = curl_exec($ch);
curl_close($ch);
Я провел большую часть прошлой недели, борясь с той же проблемой. Другие два ответа, опубликованные здесь, не работают для нас. Также не было никаких других предложений, связанных с PHP, которые я мог найти. В конце концов остановился на вызове внешнего сценария Unix, который запускал curl:
#!/bin/bash
#upload.sh
ACCESS_TOKEN="$1"FOLDER_ID="$2"FILE="$3"HEADER="Authorization: Bearer $ACCESS_TOKEN"
STATUS=`curl "https://upload.box.com/api/2.0/files/content" -H "$HEADER" -F parent_id=${FOLDER_ID} -F filename=@${FILE} -i -s | grep HTTP/1.1 | tail -1 | awk {'print $2'}` > /dev/null
if [ $STATUS == 201 ]
then
#OK
else
#Upload failed
fi
И формат вызова в PHP:
$result = shell_exec("upload.sh $box_token $folder_id $file_name");
Неудовлетворительно, но это работает. Единственное предложение, которое я могу высказать в отношении того, почему PHP CURL не работает, это то, что что-то в конвейере мешает с токеном. Это на PHP 5.5.15.