有关CURL 将图片上传去远程服务器
我自己东拼西拼的弄了个功能
是把编辑器中有远程图片就下载到本地主机的一个小功能
正正常常的,好好的可以用,可是图片越来越多,需要把网页服务器 和 附件服务器分开保存
所以需要上传到远程的服务器中
本来我自动下载的类里面是用了最基本的fopen等等来保存,如下
$write_fd = fopen($pic_name,"wb"); fwrite($write_fd, $this->CurlGet($pic_item)); fclose($write_fd);
可是要如何才能实现远程的呢?
我试了下把这一段改成:
header('content-type:text/html;charset=utf8'); $curl = curl_init(); $data = array('img'=>'@'. $this->CurlGet($pic_item)); curl_setopt($curl, CURLOPT_URL, "http://xxxx.com/autodl.php?dir=$this->folder"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); $result = curl_exec($curl); curl_close($curl); echo json_decode($result);
但却完全没效
有关autodl.php的内容,大概是:
<?phpheader("Access-Control-Allow-Origin: http://www.gamertb.com");header("Content-Type: applicaton/json"); if($_FILES) { // print_r($_FILES); $filename = $_FILES['img']['name']; $tmpname = $_FILES['img']['tmp_name']; $dir = $_GET['dir']; if(move_uploaded_file($tmpname, dirname(__FILE__).$dir.$filename)) { echo json_encode('上传成功'); } else { $data = json_encode($_FILES); echo $data; } }?>
仍然失败,诚心救肋,望高手相助
整个类的代码好像太多,我放在二楼
回复讨论(解决方案)
整个自动下载的类
class AutoImgDL {private $content;private $folder;private $home_url;private $loacl_host;public function __construct($content,$folder,$dir_level="../../"){ $this->content = $content; $this->folder = $folder; $this->dir_level = $dir_level; $this->loacl_host = "abc.com"; $this->get_unique = $this->get_unique(); $this->home_url = 'http://data.abc.com/'.$this->folder;}//create microtime to set unique idprivate function get_unique(){ list($msec, $sec) = explode(" ",microtime()); return $sec.intval($msec*1000000); } private function get_pic($content) { $pattern_src = '/< *img[^>]*src *= *["\']?([^"\']*)/i'; $num = preg_match_all($pattern_src, $content, $match_src); //get all images $arr_src_remote=$match_src[1]; //img type $pattern_type = '/(.JPEG|.jpeg|.JPG|.jpg|.GIF|.gif|.BMP|.bmp|.PNG|.png)/'; //foreach images file name 123456789.img_type $arr = ""; foreach($arr_src_remote as $pic_item){ preg_match("/^(http:\/\/)?([^\/]+)/i",$pic_item, $matches); $host = $matches[2]; preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches); if ( $matches[0] != $this->loacl_host ) { $num = preg_match_all($pattern_type, $pic_item, $match_type); $unique_name = $this->get_unique().$match_type[1][0]; $pic_name = $this->dir_level.$this->folder.$unique_name; $img_url = $this->home_url.$unique_name; //save images $write_fd = fopen($pic_name,"wb"); fwrite($write_fd, $this->CurlGet($pic_item)); fclose($write_fd); }else{ $img_url = $pic_item; } $arr .= $img_url.'-'; } //chage img new url $new_arr = explode('-',$arr); array_pop($new_arr); return $op = str_replace($arr_src_remote,$new_arr,$content);} // CURL private function CurlGet($url){ $url=str_replace('&','&',$url); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_REFERER,$url); curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; SeaPort/1.2; Windows NT 5.1; SV1; InfoPath.2)"); curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookie.txt'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 0); $values = curl_exec($curl); curl_close($curl); return $values; }// output and run public function output(){ return $this->get_pic($this->content);}}
调用时:
$folder = 'data/'.$id.'/'; $dlimg = new AutoImgDL($content,$folder); $content = $dlimg -> output();
有需要的朋友也可以拿去用~本地下载没问题
求高手助一臂之力
请问要如何作出调整及修改才能变成上传去远程?
甚至放弃到想用ftp function 来完成,也没成效
Warning: ftp_put() expects parameter 3 to be a valid path, string given 这错误网上很少~也没找到确认答案到底是错什么
$host = 'ftp.XXXX.com';$usr = 'xxxx@xxxx.com';$pwd = 'xxxxxxx';$local_file=$this->CurlGet($pic_item);$ftp_path = '/'.$this->folder.$pic_name;$conn_id = ftp_connect($host, 21) or die ("Cannot connect to host");ftp_login($conn_id, $usr, $pwd) or die("Cannot login");$upload = ftp_put($conn_id, $ftp_path, $local_file, FTP_ASCII);ftp_close($conn_id);
一直说错误~所以还是想从curl 这好像高效一点的地方入手
我能试的都试过了,不是伸手党,希望大家能协助一下
$data = array('img'=>'@'. $this->CurlGet($pic_item));
$this->CurlGet($pic_item) 返回的是什么?
$data = array('img'=>'@'. $this->CurlGet($pic_item));
$this->CurlGet($pic_item) 返回的是什么?
一大堆的乱码
估计就是图片档案吧 (为什么说估计?这类已经是1年多前拼凑起来的,看了下代码,应该是图片)
$data = array('img'=>'@'. $this->CurlGet($pic_item));
这里需要绝对路径的文件名
$data = array('img'=>'@'. $this->CurlGet($pic_item));
这里需要绝对路径的文件名
你是指远程图片的直接网址?
文件名和网址还是有区别的吧?
文件名和网址还是有区别的吧?
你好,先谢谢你几次的回应及帮助
我的意思是$data = array('img'=>'@'. $this->CurlGet($pic_item));
要用上的是远程还是别家人我没下载时的网址吧? 还是目标的 绝对路径的文件名 (附件服务器上将会保存的位置)?
其实我这段CURL都只是参考手册而生成的,不知道这段CURL本身有没有问题?
或者整个思路是否有更好的走向?
我每篇文章一般不会超过15~20张图片~用CURL比较好还是用ftp_connect比较好?
啊对了~版主我明白你的意思
你说我要加上类似这样的句子
$data = array('img'=>'@'. dirname(__FILE__).'/img/login.gif');
但问题是....
我在作操时根本还未有绝对路径
我原来的代码(整体) 在#1
63行开始~用CURL下载
所以我才会试用CURL的$this->CurlGet($pic_item)才填在这位置
如果我是不在自己主机上的话,等于远程再上传去远程的话我该如何是好?
你自己的服务器为 A,远程服务器为 B
那么 $this->CurlGet($pic_item) 取回的是 B 中的图片数据
需要保存成文件于 A,然后再 $data = array('img'=>'@'. '保存的文件名');
才可以通过 curl 上传
如果想直接发送数据可话,可见我 blog 中的另类做法 http://blog.csdn.net/xuzuning/article/details/7444709
图片需要使用绝对地址,不是网址
例如 获取当前目录的图片绝对地址,可以这样写: dirname(__FILE__).'/文件名';
谢谢两位版主的意见
我试了xuzuning大哥的blog中的那个做法
加入了在我的类中,试了好多次都不成功
我的案例是否建立个临时目录再上去会更简单?
在我的类中再加多一个FUNCTION(步骤)做 需要保存成文件于 A,然后再 $data = array('img'=>'@'. '保存的文件名'); ?
能否跟少少提示?

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。
