Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-curl文件传输_Php_Curl - Fatal编程技术网

PHP-curl文件传输

PHP-curl文件传输,php,curl,Php,Curl,我们正在使用GLPI API,我们需要创建一个与文档链接的票据 我唯一不能翻译的部分是文件的上传 带卷曲(工作): 但我无法翻译这是在PHP CURL中,我尝试了以下方法: $headers = array( 'Authorization: Basic ' . $_SESSION['encodelogin'], 'App-Token:' . $_SESSION['app_token'], // <--- 'Session-Token:' . $_SESSION['session_

我们正在使用GLPI API,我们需要创建一个与文档链接的票据

我唯一不能翻译的部分是文件的上传

带卷曲(工作):

但我无法翻译这是在PHP CURL中,我尝试了以下方法:

  $headers = array(
 'Authorization: Basic ' . $_SESSION['encodelogin'],
 'App-Token:' . $_SESSION['app_token'], // <---
 'Session-Token:' . $_SESSION['session_token'],
 'Http_Accept: application/json',

);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_exec($ch);
echo $url = $_SESSION['api_url'] . "/Document";

$cfile = new CURLFile('testpj.txt', 'text/plain', 'test_name');
//$manifest = 'uploadManifest={"input": {"name": "test", "_filename" : "testpj.txt"}};type=application/json filename[0]=@'+$cfile;
$post = ["{\"input\": {\"name\": \"test\", \"_filename\" : \"testpj.txt\"}};type=application/json}", @"C:\\xampp\htdocs\glpi"];
print_r($post);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
$headers=数组(
“授权:基本”。$\u会话['encodelogin'],
“应用程序令牌:”。$\u会话[“应用程序令牌”],//$param\u值){
$parameters[$param_name]=$param_值;
}
}如果(strlen($body)>0,则为else{
$this->returnError(“JSON负载似乎无效”,400,“错误\u JSON\u负载\u无效”,
假);
}
$this->format=“json”;
}else if(strpos($content_type,“multipart/form data”)!==false){
if(count($\u FILES)returnError(“文件似乎太大!”)。print\r($\u FILES),400,
“错误\上传\文件\太大\发布\最大\大小”,错误);
}
//对于这种内容类型,php://input 是空的…(参见http://php.net/manual/en/wrappers.php.php)
if(!$uploadManifest=json_解码(stripcslashes($_请求['uploadManifest'])){
//打印(美元文件);
$this->returnError(“JSON负载似乎无效”,400,“错误\u JSON\u负载\u无效”,
假);
}
我在$\u请求中没有uploadManifest,如果我将文件名[0]放入文件,则会出现curl错误26(无法读取文件)

谢谢你翻译

-F "uploadManifest={\"input\": {\"name\": \"Uploaded document\", \"_filename\" : \"test.txt\"}};type=application/json"
这是一个棘手的问题,因为php不支持将内容类型头(或任何真正的头)添加到多部分请求的成员中,唯一的*例外*(我知道)是CURLFile的“内容类型”和内容处置的“文件名”header…考虑到这一点,您可以通过将数据放入一个文件并围绕该伪文件创建一个CURLFile(),来解决这个问题,但它看起来很复杂和愚蠢(因为PHP的curl api包装器缺乏对它的适当支持)

使用CURLFile解决方案,它看起来像:

<?php
declare(strict_types = 1);
$ch = curl_init();
$stupid_workaround_file1h = tmpfile();
$stupid_workaround_file1f = stream_get_meta_data($stupid_workaround_file1h)['uri'];
fwrite($stupid_workaround_file1h, json_encode(array(
    'input' => array(
        'name' => 'Uploaded document',
        '_filename' => 'test.txt'
    )
)));
curl_setopt_array($ch, array(
    CURLOPT_URL => "http://glpitest/glpi/apirest.php/Document",
    CURLOPT_POST => 1,
    CURLOPT_HEADER => 1,
    CURLOPT_HTTPHEADER => array(
        "Session-Token:sessiontoken",
        "App-Token:apptoken"
    ),
    CURLOPT_POSTFIELDS => array(
        'uploadManifest' => new CURLFile($stupid_workaround_file1f, 'application/json', ' '), // https://bugs.php.net/bug.php?id=79004
        'filename[0]' => new CURLFile('test.txt', 'text/plain')
    )
));
curl_exec($ch);
curl_close($ch);
fclose($stupid_workaround_file1h);
谢谢你的帮助

$文档可以是$\u文件['whatever']帖子。

在GLPIAPI上工作

<?php
declare (strict_types = 1);
session_start();
$document = array('name' => 'document', 'path' => 'C:\xampp\htdocs\glpi\document.pdf', 'type' => 'txt', 'name_ext' => 'document.pdf');
$url = $_SESSION['api_url'] . "/Document";
$uploadManifest = json_encode(array(
 'input' => array(
  'name' => $document['name'],
  '_filename' => $document['name_ext'],
 ),
));

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLINFO_HEADER_OUT, 1);

curl_setopt_array($ch, array(
 CURLOPT_URL => $url,
 CURLOPT_POST => 1,
 CURLOPT_HEADER => 1,
 CURLOPT_HTTPHEADER => array(
  'Content-Type: multipart/form-data',
  'Authorization: Basic ' . $_SESSION['encodelogin'],
  'App-Token:' . $_SESSION['app_token'], // <---
  'Session-Token:' . $_SESSION['session_token'],
 ),

 CURLOPT_POSTFIELDS => array(
  'uploadManifest' => $uploadManifest,
  'filename[0]' => new CURLFile($document['path'], $document['type'], $document['name_ext']),
 ),
));
print_r($_REQUEST);
echo $result = curl_exec($ch);

echo "erreur n° " . curl_errno($ch);
$header_info = curl_getinfo($ch, CURLINFO_HEADER_OUT) . "/";
print_r($header_info);
if ($result === false) {
 $result = curl_error($ch);
 echo stripslashes($result);

}
curl_close($ch);

是您遇到问题的清单JSON还是实际文件?我真的不知道..上传清单对我来说似乎没问题。
-F "uploadManifest={\"input\": {\"name\": \"Uploaded document\", \"_filename\" : \"test.txt\"}};type=application/json"
<?php
declare(strict_types = 1);
$ch = curl_init();
$stupid_workaround_file1h = tmpfile();
$stupid_workaround_file1f = stream_get_meta_data($stupid_workaround_file1h)['uri'];
fwrite($stupid_workaround_file1h, json_encode(array(
    'input' => array(
        'name' => 'Uploaded document',
        '_filename' => 'test.txt'
    )
)));
curl_setopt_array($ch, array(
    CURLOPT_URL => "http://glpitest/glpi/apirest.php/Document",
    CURLOPT_POST => 1,
    CURLOPT_HEADER => 1,
    CURLOPT_HTTPHEADER => array(
        "Session-Token:sessiontoken",
        "App-Token:apptoken"
    ),
    CURLOPT_POSTFIELDS => array(
        'uploadManifest' => new CURLFile($stupid_workaround_file1f, 'application/json', ' '), // https://bugs.php.net/bug.php?id=79004
        'filename[0]' => new CURLFile('test.txt', 'text/plain')
    )
));
curl_exec($ch);
curl_close($ch);
fclose($stupid_workaround_file1h);
<?php
declare (strict_types = 1);
session_start();
$document = array('name' => 'document', 'path' => 'C:\xampp\htdocs\glpi\document.pdf', 'type' => 'txt', 'name_ext' => 'document.pdf');
$url = $_SESSION['api_url'] . "/Document";
$uploadManifest = json_encode(array(
 'input' => array(
  'name' => $document['name'],
  '_filename' => $document['name_ext'],
 ),
));

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLINFO_HEADER_OUT, 1);

curl_setopt_array($ch, array(
 CURLOPT_URL => $url,
 CURLOPT_POST => 1,
 CURLOPT_HEADER => 1,
 CURLOPT_HTTPHEADER => array(
  'Content-Type: multipart/form-data',
  'Authorization: Basic ' . $_SESSION['encodelogin'],
  'App-Token:' . $_SESSION['app_token'], // <---
  'Session-Token:' . $_SESSION['session_token'],
 ),

 CURLOPT_POSTFIELDS => array(
  'uploadManifest' => $uploadManifest,
  'filename[0]' => new CURLFile($document['path'], $document['type'], $document['name_ext']),
 ),
));
print_r($_REQUEST);
echo $result = curl_exec($ch);

echo "erreur n° " . curl_errno($ch);
$header_info = curl_getinfo($ch, CURLINFO_HEADER_OUT) . "/";
print_r($header_info);
if ($result === false) {
 $result = curl_error($ch);
 echo stripslashes($result);

}
curl_close($ch);