Table des matières
回复讨论(解决方案)
Maison développement back-end tutoriel php 有关CURL 将图片上传去远程服务器

有关CURL 将图片上传去远程服务器

Jun 20, 2016 pm 12:31 PM

我自己东拼西拼的弄了个功能

是把编辑器中有远程图片就下载到本地主机的一个小功能

正正常常的,好好的可以用,可是图片越来越多,需要把网页服务器 和 附件服务器分开保存

所以需要上传到远程的服务器中

本来我自动下载的类里面是用了最基本的fopen等等来保存,如下

$write_fd = fopen($pic_name,"wb");  fwrite($write_fd, $this->CurlGet($pic_item));  fclose($write_fd);
Copier après la connexion


可是要如何才能实现远程的呢?

我试了下把这一段改成:
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);
Copier après la connexion


但却完全没效
有关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;        }    }?>
Copier après la connexion


仍然失败,诚心救肋,望高手相助

整个类的代码好像太多,我放在二楼


回复讨论(解决方案)

整个自动下载的类

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);}}
Copier après la connexion


调用时:
    $folder = 'data/'.$id.'/';    $dlimg = new AutoImgDL($content,$folder);    $content = $dlimg -> output();
Copier après la connexion


有需要的朋友也可以拿去用~本地下载没问题

求高手助一臂之力

请问要如何作出调整及修改才能变成上传去远程?

甚至放弃到想用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);
Copier après la connexion



一直说错误~所以还是想从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'=>'@'. '保存的文件名');  ?

能否跟少少提示?

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Apr 05, 2025 am 12:04 AM

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Comment fonctionne le détournement de session et comment pouvez-vous l'atténuer en PHP? Comment fonctionne le détournement de session et comment pouvez-vous l'atténuer en PHP? Apr 06, 2025 am 12:02 AM

Le détournement de la session peut être réalisé via les étapes suivantes: 1. Obtenez l'ID de session, 2. Utilisez l'ID de session, 3. Gardez la session active. Les méthodes pour empêcher le détournement de la session en PHP incluent: 1. Utilisez la fonction Session_RegeReate_id () pour régénérer l'ID de session, 2. Stocker les données de session via la base de données, 3. Assurez-vous que toutes les données de session sont transmises via HTTPS.

Décrivez les principes solides et comment ils s'appliquent au développement de PHP. Décrivez les principes solides et comment ils s'appliquent au développement de PHP. Apr 03, 2025 am 12:04 AM

L'application du principe solide dans le développement de PHP comprend: 1. Principe de responsabilité unique (SRP): Chaque classe n'est responsable d'une seule fonction. 2. Principe ouvert et ferme (OCP): les changements sont réalisés par extension plutôt que par modification. 3. Principe de substitution de Lisch (LSP): les sous-classes peuvent remplacer les classes de base sans affecter la précision du programme. 4. Principe d'isolement d'interface (ISP): utilisez des interfaces à grain fin pour éviter les dépendances et les méthodes inutilisées. 5. Principe d'inversion de dépendance (DIP): les modules élevés et de bas niveau reposent sur l'abstraction et sont mis en œuvre par injection de dépendance.

Comment déboguer le mode CLI dans phpstorm? Comment déboguer le mode CLI dans phpstorm? Apr 01, 2025 pm 02:57 PM

Comment déboguer le mode CLI dans phpstorm? Lors du développement avec PHPStorm, nous devons parfois déboguer PHP en mode interface de ligne de commande (CLI) ...

Comment définir automatiquement les autorisations d'UnixSocket après le redémarrage du système? Comment définir automatiquement les autorisations d'UnixSocket après le redémarrage du système? Mar 31, 2025 pm 11:54 PM

Comment définir automatiquement les autorisations d'UnixSocket après le redémarrage du système. Chaque fois que le système redémarre, nous devons exécuter la commande suivante pour modifier les autorisations d'UnixSocket: sudo ...

Expliquez la liaison statique tardive en PHP (statique: :). Expliquez la liaison statique tardive en PHP (statique: :). Apr 03, 2025 am 12:04 AM

Liaison statique (statique: :) ​​implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

Comment envoyer une demande post contenant des données JSON à l'aide de la bibliothèque Curl de PHP? Comment envoyer une demande post contenant des données JSON à l'aide de la bibliothèque Curl de PHP? Apr 01, 2025 pm 03:12 PM

Envoyant des données JSON à l'aide de la bibliothèque Curl de PHP dans le développement de PHP, il est souvent nécessaire d'interagir avec les API externes. L'une des façons courantes consiste à utiliser la bibliothèque Curl pour envoyer le post� ...

See all articles