我完全受困于这种情况,问题1:我想将文件从一台服务器发送到另一台服务器,对于发送文件,我使用curl,这是通过curl发送文件的标准代码或更常见的代码:curl `$url = $callthis;$filename =$_FILES‘’orig_ file _name‘;$filedata =$_FILES’‘orig_ file _name’;$filesize =$_FILES‘’orig_ file _name‘;if ($filedata != '') {
$headers = array("Content-Type:multipart/form-data"); // cURL headers for file uploading
$postfields = array("orig_file_name" => "@$filedata", "filename" => $filename, 'user_id' => $this->Session->read('userid'),
'artwork_type'=>$this->request->data['artwork_type'],
'description'=>$this->request->data['description'],
'itemstable_id'=>$this->request->data['itemstable_id'],
'upload_date'=>$this->request->data['upload_date'],
'brand_Approved'=>'New');
$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
); // cURL options
curl_setopt_array($ch, $options);
curl_exec($ch);
if(!curl_errno($ch))
{
$info = curl_getinfo($ch);
debug($info);
if ($info['http_code'] == 200)
return $this->redirect(array('action' => 'uploadedart'));
}
else
{
$errmsg = curl_error($ch);
$this->Session->setFlash(__($errmsg));
}
curl_close($ch);
}`仅供参考,curl安装在服务器上并启用此代码在我的本地PC和linux系统上运行良好,但我的代码将在amazone IIS服务器上实现,所以当我上传代码,然后测试它时,它会给我0状态代码,当我在谷歌上搜索时,他们说你的URL不正确,这在我的情况下是正确的,所以问题是'@‘符号放在curl请求的文件名之前,在php curl文档中,他们说@ sign是必须的,以便告诉接收服务器它是一个物理文件,而不是纯文本。当我删除这个@符号时,我从接收端得到200个响应码,但文件没有保存在所需的目录中.
问题2:我实现了来自stackoverflow中的一个人的另一个代码:` $url = $callthis;$filename =$_FILES‘’orig_file_name‘;$filedata =$_FILES’‘orig_file_name’;$filesize =$_FILES‘’orig_file_name‘;//debug($this->request->data);exit();if ($filedata != ''){
move_uploaded_file($filedata, APP."webroot".DS."upload".DS.$filename);
$newfile=APP."webroot".DS."upload".DS.$filename;
//exit;
/* begin stuff */
$postfields = array('user_id' => $this->Session->read('userid'),
'artwork_type'=>$this->request->data['artwork_type'],
'description'=>$this->request->data['description'],
'itemstable_id'=>$this->request->data['itemstable_id'],
'upload_date'=>$this->request->data['upload_date'],
'brand_Approved'=>'New');
$file_url = $newfile; //here is the file route, in this case is on same directory but you can set URL too like "http://examplewebsite.com/test.txt"
$eol = "\r\n"; //default line-break for mime type
$BOUNDARY = md5(time()); //random boundaryid, is a separator for each param on my post curl function
$BODY=""; //init my curl body
$BODY.= '--'.$BOUNDARY. $eol; //start param header
$BODY .= 'Content-Disposition: form-data; name="otherfields"' . $eol . $eol; // last Content with 2 $eol, in this case is only 1 content.
$BODY .= serialize($postfields) . $eol;//param data in this case is a simple post data and 1 $eol for the end of the data
$BODY.= '--'.$BOUNDARY. $eol; // start 2nd param,
$BODY.= 'Content-Disposition: form-data; name="orig_file_name"; filename="'.$filename.'"'. $eol ; //first Content data for post file, remember you only put 1 when you are going to add more Contents, and 2 on the last, to close the Content Instance
$BODY.= 'Content-Type: application/octet-stream' . $eol; //Same before row
$BODY.= 'Content-Transfer-Encoding: base64' . $eol . $eol; // we put the last Content and 2 $eol,
$BODY.= chunk_split(base64_encode(file_get_contents($file_url))) . $eol; // we write the Base64 File Content and the $eol to finish the data,
$BODY.= '--'.$BOUNDARY .'--' . $eol. $eol; // we close the param and the post width "--" and 2 $eol at the end of our boundary header.
$ch = curl_init(); //init curl
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'X_PARAM_TOKEN : 71e2cb8b-42b7-4bf0-b2e8-53fbd2f578f9' //custom header for my api validation you can get it from $_SERVER["HTTP_X_PARAM_TOKEN"] variable
,"Content-Type: multipart/form-data; boundary=".$BOUNDARY) //setting our mime type for make it work on $_FILE variable
);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/1.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0'); //setting our user agent
curl_setopt($ch, CURLOPT_URL, $url); //setting our api post url
//curl_setopt($ch, CURLOPT_COOKIEJAR, $BOUNDARY.'.txt'); //saving cookies just in case we want
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // call return content
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); //navigate the endpoint
curl_setopt($ch, CURLOPT_POST, true); //set as post
curl_setopt($ch, CURLOPT_POSTFIELDS, $BODY); // set our $BODY
$response = curl_exec($ch); // start curl navigation
print_r($response); //print responsethis works fine but only with text files because it doeschunk_split(base64_encode(file_get_contents($file_url)))`我的意思是读取要发送的文件,这在文本文件中是无效的,但在我的例子中,我想发送的图像在问题2中不起作用,因为它修改了图像内容,因此无法打开图像……
仅供参考,我不能做jquery/ajax文件发送,我需要通过php做,所以答案应该是有效的可行的curl请求代码发送文件或cakephp httpsocket与发送文件
发布于 2015-02-24 00:59:22
请注意,PHP >=5.6在默认情况下禁用curl的@file约定,所以如果您有不同的版本,这可能是您的问题。
要在PHP >=5.6中使用现有代码,您可以添加
CURLOPT_SAFE_UPLOAD => false添加到您的选项数组中。
如果这是您的问题,请参阅更改日志以了解更多信息:http://us3.php.net/manual/en/migration56.changed-functions.php
否则,只是为了清楚:这不应该与您的web服务器(IIS与Apache)直接相关,除非服务器使用的是不同的php配置,或者运行您的web服务器的服务的用户具有影响您的脚本的权限。
所以您确定php/curl库在您的环境中运行正常吗?:有时我只是在终端命令提示符下执行"hello word“测试,例如:
php -r "$ch = curl_init('http://www.google.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); die($output);"这应该只是将google.com的代码转储到您的终端中。这很管用,对吧?
对您的url执行相同的操作...尤其是当你使用SSL的时候!您可能会遇到SSL问题,如对等验证等!还要注意的是,如果上面的方法适用于https://your.url.com,如果SSL库依赖项(在IIS的情况下是libeay32.dll和ssleay32.dll )可能无法访问,则可能无法保证它在您的web应用程序中有效。
状态码为0似乎表示根据上述测试将弹出一些东西,但它可能出于其他原因放弃了幽灵:
例如,您确定代码中的$filedata是一个可访问的路径吗?也许可以在设置这些帖子字段之前尝试一下:
如果(!is_file($filedata)) die('where is‘。$filedata。'?');
发布于 2015-11-26 17:18:18
@filename在PHP >= 5.5.0中已被弃用:
改用新的 CurlFile,不需要在接收端做任何更改。
https://stackoverflow.com/questions/28676307
复制相似问题