手机版

PHP如何上传图片文件到另一个服务器

时间:2021-08-20 来源:互联网 编辑:宝哥软件园 浏览:

说,我有一个需要,那就是一个临时的功能。由于工作开发的问题,我们有一个B项目,需要有添加商品的功能,这就涉及到添加商品内容,比如商品名称、商品描述、商品库存、商品图片等等。添加背景产品的界面已经完成,但问题是目前没有背景页面,也就是产品还没有产生背景详情页。前端已完成并在线。后台需要工作时间。所以目前的处理方式是在我们现有的A项目的后台,给B项目增加一个添加商品的功能。

第一,当前的问题

1.在我们现有的项目a中,我们增加了一个添加商品的功能,本来是没有问题的,因为项目b的数据库已经在项目a中连接了,所以添加和修改商品的属性是没有问题的。这里主要是产品图片的上传,但是有一个问题。项目B提供了上传图片的界面,但是我对前端不是特别熟悉。所以在A项目后台JS调用B项目上传图片的界面时,总是提示‘CORS’。这里应该有跨域的问题。虽然我的PHP接口已经处理了跨域(在入口文件处),但是JS似乎需要做相应的调整。

//[应用入口文件]//入口文件index.php命名空间think//加载基本文件需要_ _ dir _ _。/think PHP/base . PHP ';//支持提前静态方式设置Request对象和Config对象的头('访问控制-允许-原点: * ');标题('访问控制-允许-标题:内容类型,XFILENAME,XFILECATEGORY,XFILESIZE,授权');//执行应用程序并响应container : get(' app ')-bind(' API ')-run()-send();2.但是小白JS不够扎实,所以我准备在项目A中调用后台PHP接口,然后接受PHP代码中的web参数,然后转发,在项目B中调用上传图片的接口,尝试完成功能。因此,我们首先通过Postman接口工具测试了项目B中上传图片的接口是否有效。如图3所示,发现确实没有问题,所以我准备这么做。

3.实际上,在调用时,我们通常使用GET或POST来传递参数,但是我们知道文件上传是通过$_FILES接受的。以下是上传项目B图片的控制器代码(使用TP5.1),通过内置文件验收。

/* *上传图片* @ param request $ request */public function uploadimg(request $ request){ $ file=$ request-file(' image ');$type=$request-post('type ',0);//移动到$ upload _ path=config ('common。upload _ path’)在框架应用程序根目录下/uploads/;switch($ type){ case 1://store $ path=$ upload _ path[' shop _ img '];打破;Case 2://投票活动$ path=$ upload _ path[' vote _ img '];打破;案例3://投票活动图片$ path=$ upload _ path[' vote _ contest _ img '];打破;Case 4://会员商店徽标图片$ path=$ upload _ path[' member _ shop '];打破;案例5://自营商品图片$ path=$ upload _ path ['自营_商品'];打破;default : $ path=$ upload _ path[' common '];打破;} $save_path=env('root_path ')。$ path$ info=$ file-validate([' ext '=' jpg,jpeg,png,gif '])-move($ save _ path);if($ info){ $ return=[' extension '=$ info-getExtension(),' image_path'=$path。$info-getSaveName(),' image_name'=$info-getFilename(),];$ this-a piresult(customerror :3360 operation _ successs,$ return);} else { $ this-apiResult(customerror : operation _ FAILED,[],$ file-getError());} }4.所以从A项目网侧传来的文件内容有点不堪重负。该死该死。

//文件上传接受参数数组(1) { ['file_upload']=数组(5){[' name ']=string(8)' timg。jpg '[' type ']=string(10)' image/JPEG '[' tmp _ name ']=string(22)' c : \ Windows \ php73ce。tmp '[' error ']=int(0)[' size ']=int(355565)} } 5,所以按刚才设想的,简单做下转发还是不行,这里面参数的传输方式应该还有另外一种,就是文件的类型。鉴于是通过邮递员方式上传成功,这个工具确实很推荐多多学习,他不仅作为一个第三方中间为我们验证接口是否可用,更给我们提供了调取接口的各种代码达摩,如图3中标识的密码处,就是获取达摩的按钮。我们点击可以看见邮递员给我提供了三种,调取接口的方式。

?php//1、HttpRequest发送超文本传送协议(超文本传输协议的缩写)请求$ request=new Httprequest();$ request-setURl(' http://jszapi。戴夫。京津冀。com/index。PHP/index/uploadImg’);$ request-setMethod(HTTP _ method _ POST);$request-setHeaders(数组(“缓存控制”=“无缓存”、“连接”=“保持活动”、“内容长度”=“39091”、“内容类型”=“多部分/表单数据”;boundary=-29660870622243058746908 ',' Accept-Encoding'='gzip,deflate ',' Host '=' jszapi。戴夫。京津冀。com ',' Postman-Token '=' DC 010150-b166-4dec-a33f-959 a 65 c 91c 71,be 7315 CB-ae21-404 f-89fa-dddf 5973 eb3a ',' Cache-Control'='no-cache边界=-webkitformboundry7ma 4 ywxktrzu 0 GW’);$ request-set body('-webkitformboundry7ma 4 ywxktrzu 0 gwcontent-disposition :表单-数据;名称=' imagefilename=' 785 da 43 beca 5a 444。jpg ' content-type : image/JPEG-webkitformboundry7ma 4 ywxktrzu 0 GW-');尝试{ $ response=$ request-send();echo $ response-GetBody();} catch(HttpException $ ex){ echo $ ex;}

?php//2、pecl_http需要开启PECL HTTP扩展$client=新的http \ Client $请求=新的http \客户端\请求$正文=新http \ Message \ Body $ Body-addForm(NULL,array(array('name'='image ',' type'=null,' file'='/E:/MyBooks/网站图标/网站素材785 da 43 beca 5a 444。jpg ',' data '=null));$ request-SetRequestURl(' http://jszapi。戴夫。京格尔戈。com/index。PHP/index/uploadImg’);$ request-setrequest方法(' POST ');$ request-SetBody($ body);$request-setHeaders(数组(“缓存控制”=“无缓存”、“连接”=“保持活动”、“内容长度”=“39091”、“内容类型”=“多部分/表单数据”;boundary=-29660870622243058746908 ',' Accept-Encoding'='gzip,deflate ',' Host '=' jszapi。戴夫。京津冀。com ',' Postman-Token '=' DC 010150-b166-4dec-a33f-959 a 65 c 91c 71,3216 cc 22-be 61-4d 4 B- 8d 41 c 5178848 b 54f ',' Cache-Control '=' $ client-enqueue($ request)-send();$ response=$ client-GetResponse();echo $ response-GetBody();php//3、cURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,我们使用它来发送超文本传送协议请求。//它给我们带来的好处是可以通过灵活的选项设置不同的超文本传送协议协议参数,并且支持HTTPS。卷曲可以根据统一资源定位器前缀是" HTTP "还是“HTTPS”自动选择是否加密发送内容$ curl=curl _ init();curl_setopt_array($curl,array(CURLOPT _ URL=' http://jszapi。戴夫。京津冀。com/index。PHP/index/uploadImg ',CURLOPT_RETURNTRANSFER=true,CURLOPT_ENCODING=' ',CURLOPT_MAXREDIRS=10,CURLOPT_TIMEOUT=30,CURLOPT _ HTTP _ VERSION=CURL _ HTTP _ VERSION _ 1 _ 1,CURLOPT_CUSTOMREQUEST='POST ',CURLOPT _ POSTFIELDS='-webkitformname=\ ' image \ filename=\ ' 785 da 43 beca 5444。jpg \ ' \ r \ n Content-type : image/JPEG \ r \ n \ r \ n \ r \ n-webkitformboundary 7 ma4ywxktrzu-GW ',CURLOPT _ HTTPHEADER=array(' Accept : */* ',' Accept-Encoding: gzip,deflate ',' Cache-Control:无缓存,' Connection: keep-alive ',' Content-Content border=-296608706222243058746908 ',' host : jszapi。戴夫。京津冀。' com ',' Postman-token : DC 010150-b166-4dec-a33f-959 a 65 c 91 c 71,982 e 059 e-bd8 B- 4 db 9-83 C4-3fd 52 c8 ed 82 f ',' User-agent 3: post manruntime/7。112边界=-webkitformboundry7ma 4 ywxktrzu 0 GW’);$ response=curl _ exec($ curl);$ err=curl _ error($ curl);curl _ close($ curl);if ($err) { echo 'cURL Error #: ' .$ err} else { echo $ response}

6、如上面3个代码片段,但是后来验证后,发现1/3的参数,不知道是怎么传输的,2的参数很容易看懂,但是运用的话需要开启扩展,这个目前不太合适,所以﹏。

二、写在心里

1、这个上传的问题,确实卡住了,感觉有点难过。其实每次都会遇见一个自己的困难,经常遇见,周末下午的时候,我在家打开电脑,打来远程,准备登陆下文件传输协议(文件传输协议的缩写)拉下代码,发现一直连不上,心里那个烦啊。但是还是通过远程工具(向日葵),将代码拉下来了。想这个图片上传到底怎么弄了,之前也看过,关于通过文件传输协议(文件传输协议的缩写)的方式上传图片,但是后来查看了相关文章需要在php.ini中开启,所以也作罢。

#开启文件传输协议(文件传输协议的缩写)扩展支持扩展名=php_ftp.dll

2、经常遇见困难,经常觉得自己很低的但是,已经工作了这么久,发现其实问题最后又都解决了,但是现在回想,却忘了到底是怎么解决的,所以写这个博文主要也是想记录下。一直到下午四点多,深圳的天气今年闷热居多,中午我已经昧着良心午休了一个小时,所以现在到现在心里还有些许内疚,唉。

3、但是还是找不到解决的方法,头疼的厉害,好热。怎么办,我决定靠在椅子上休息下,于是我还是决定躺在沙发上睡会。刚躺下,想着这怎么办呢。

base64华丽的分割线

我突然想到了base64这个读起来,朗朗上口的函数,对如果现将图片转换成base64字符串,再通过邮政方式传送给B项目,然后再B项目中对字符串进行解码,生成图片,保存到B项目,然后返回图片路径,不就可以了吗。于是我有推了一遍,发现没有疏忽。于是觉得应该是解决了。

三、解决图片上传问题

1、A接受网传来图片临时文件,

#上传图片京手指1:图片保留到本地公共函数uploadJszImg(){ $ path=config(' business。jsz _ file _ tem’);$ file=request()-file(' file _ upload ');$ info=$ file-validate([' ext '=' jpg,jpeg,png,gif '])-move($ path);//图片保存到本地$img_one=$path .$ info-getSaveName();//图片路径$ img _ base=imgToBase64($ img _ one);//获取图片base64编码格式删除文件方式($路径);//删除临时文件$ URL=配置(' business。jsz _ API’)[' baseImg '];$data=[ 'base_string'=$img_base,' path'='upload/goods_img ',];$res=http_api($url,$data,1);$res=json_decode($res,true);if($ RES[' data ']){ $ return=[' code '=1,' message'='成功,' data '=' jszapi。戴夫。京津冀。com ' .$ RES[' data ']];}else{ $return=['code'=0,' message'='失败'];}退货$ return}

2、并转换成base64字符串,

/** * 获取图片的Base64编码(不支持url) * @param $img_file传入本地图片地址* @返回字符串*/函数imgToBase64($ img _ file){ $ img _ base64=' ';if(file _ exists($ img _ file)){ $ app _ img _ file=$ img _ file;//图片路径$ img _ info=getimagesize($ app _ img _ file);//取得图片的大小,类型等//回显“pre ”.print_r($img_info,true)./prebr ';$fp=fopen($app_img_file,' r ');//图片是否可读权限if($ FP){ $ file size=文件大小($ app _ img _ file);$content=fread($fp,$文件大小);$ file _ content=chunk _ split(base64 _ encode($ content));//base64编码switch ($img_info[2]) { //判读图片类型案例1: $ img _ type=' gif '打破;案例2:美元img _ type=' jpg '打破;案例3: $ img _ type=' png打破;} $img_base64='data:image/' .$img_type .base64 ' .$ file _ content//合成图片的base64编码} fc输($ FP);}返回$ img _ base64//返回图片的base64}3、B接受A项目传来参数

/** * 将base64字符串转换成图片并保存在本地* @ param Request $ Request * @ return void */public function baseImg(Request $ Request){ $ base _ string=$ Request-post(' base _ string ',' ');if(!$ base _ string){ $ this-ApiResult(customerror 3360:缺少_ PARAMS);} $path=$request-post('path ',' ');if(!$ path){ $ this-ApiResult(customerror :缺少_ PARAMS);} $ request=base64 _ image _ content($ base _ string,$ path);//解码if($ request){ $ this-ApiResult(customerror : operation _ success,$ request);} else { $ this-a piresult(customerror : operation _ FAILED);} }4、对字符解析解码

/** * [将Base64图片转换为本地图片并保存]* @ param[Base64]$ Base64 _ image _ content[要保存的Base64] * @param [目录]$路径[要保存的路径]*/function base64 _ image _ content($ base64 _ image _ content,$path){ //匹配出图片的格式如果(preg_match('/^(data:\s*image\/(\w);base64,)/',$base64_image_content,$ result)){ $ type=$ result[2];$new_file=$path .'/'.日期(' Ymd ',时间())。'/';if(!file_exists($new_file)){ //检查是否有该文件夹,如果没有就创建,并给予最高权限mkdir($new_file,0700);} $new_file=$new_file.time().if (file_put_contents($new_file,base64 _ decode(str _ replace($ result[1],'',$ base64 _ image _ content)){ return/' .$ new _ file } else { return false } } else { return false } }

5、最后返回上传好的图片路径

:结束

总结

以上就是PHP如何上传图片文件到另一个服务器,这是边肖介绍的。希望对大家有帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!如果你觉得这篇文章对你有帮助,请转载,请注明出处,谢谢!

版权声明:PHP如何上传图片文件到另一个服务器是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。