设为首页 加入收藏

TOP

PHP代码篇(五)--如何将图片文件上传到另外一台服务上(一)
2019-09-03 03:40:18 】 浏览:121
Tags:PHP 代码 如何 图片 文件 传到 另外 服务

  说,我有一个需求,就是一个临时功能。由于工作开发问题,我们有一个B项目,需要有一个商品添加的功能,涉及到添加商品内容,比如商品名字,商品描述,商品库存,商品图片等。后台商品添加的接口已经写完了,但是问题是目前没有后台页面,就是产品还没有出后台详细页面。前端已经完备了,上线了。后台还需要工作时间处理。所以目前的处理方法是在我们已经存在的A项目后台中,添加一个对B项目添加商品的功能。

  

  一、当下问题

  1、在我们已有的A项目中,新增一个添加商品的功能,这个本来是没有什么问题的,因为目前A项目中本身就已经连接了B项目的数据库,所以商品属性的新增和修改都没什么问题。主要是商品图片的上传这里,有点问题。B项目已经对外提供了上传图片的接口,但是由于我确实对前端不是特别熟悉。所以在A项目中的后台JS中调取B项目的上传图片的接口时,一直提示"CORS",这里应该是存在一个跨域的问题,虽然我PHP接口端已经对跨域做了处理(入口文件处),但是貌似JS这边也需要相应的调整。

// [ 应用入口文件 ]
//入口文件index.php  
namespace think;

// 加载基础文件
require __DIR__ . '/thinkphp/base.php';

// 支持事先使用静态方法设置Request对象和Config对象
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type,XFILENAME,XFILECATEGORY,XFILESIZE,authorization");
// 执行应用并响应
Container::get('app')->bind('api')->run()->send();

   2、无奈小白JS功底不够扎实,所以我这边准备通过A项目中调取后台PHP接口,然后通过在PHP代码中接受web端参数,然后再转发,调取B项目中上传图片的接口,试图完成功能。于是先通过Postman接口工具测试了一下B项目上传图片的接口是否有效。如图3,发现确实没有什么问题,于是就准备如此处理。

 

 

  3、但是实际是,在调取时,我们常用的传参数方式是GET或者POST方式,但是我们知道文件上传是通过$_FILES接受,下面是B项目的上传图片的控制器代码(用的是TP5.1),接受是通过内置的file方式。

    /**上传图片
     * @param Request $request
     */
    public function uploadImg(Request $request){
        $file = $request->file('image');
        $type = $request->post('type', 0);
        // 移动到框架应用根目录/uploads/ 目录下
        $upload_path = config('common.upload_path');
        switch ($type) {
            case 1://门店
                $path = $upload_path['shop_img'];
                break;
            case 2://投票活动
                $path = $upload_path['vote_img'];
                break;
            case 3://投票活动参赛图片
                $path = $upload_path['vote_contestant_img'];
                break;
            case 4://会员店铺logo图片
                $path = $upload_path['member_shop'];
                break;
            case 5://自营商品图片
                $path = $upload_path['self_goods'];
                break;
            default:
                $path = $upload_path['common'];
                break;
        }
        $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->apiResult(CustomError::OPERATION_SUCCSESS, $return);
        }else{
            $this->apiResult(CustomError::OPERATION_FAILED, [],  $file->getError());
        }
    }

   4、所以在转发A项目web端传来的,文件内容,就有点不知所措了。该死,该死。

//文件上传接受参数
array(1) {
  ["file_upload"] => array(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、所以按刚才设想的,简单做下转发还是不行,这里面参数的传输方式应该还有另外一种,就是文件的类型。鉴于是通过Postman方式上传成功,这个工具确实很推荐多多学习,他不仅作为一个第三方中间为我们验证接口是否可用,更给我们提供了调取接口的各种代码Damo,如图3中标识的Code处,就是获取Damo的按钮。我们点击可以看见Postman给我提供了三种,调取接口的方式。

<?php
//1、HttpRequest 发送http请求
$request = new HttpRequest();
$request->setUrl('http://jszapi.dev.jingjinglego.com/index.php/index/uploadImg');
$request->setMethod(HTTP_METH_POST);

$request->setHeaders(array(
  'cache-control' => 'no-cache',
  'Connection' => 'keep-alive',
  'Content-Length' => '39091',
  'Content-Type'
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[小程序]微信小程序登陆并获取用.. 下一篇Laravel 最佳实践

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目