php 通过curl将上传的form表单整个post到处理业务的请求中

背景:图片搜索的项目中,因为php运行的服务器和java运行的搜索接口服务器可能不是同一台服务器。所以不能用直接读取文件目录形式获取用户上传的搜索图片,解决方法有两个1.将php端上传的图片相关信息直接提交到java接口端;2.用FastDFS分布式文件系统,将用户上传的搜索图片放到指定的图片服务器上。

因为对分布式文件系统不熟悉,负责项目安全和稳定的大拿,不太赞同第二个解决方案,最终选择了第一个。

首先:确保php项目中已经安装了curl的扩展。

第二步:将用户上传的图片写到项目的指定临时存储文件目录中,因为curl提交文件类型参数时,不能提交从form表单中获取的临时文件信息,而应该是一个真实存在的文件地址。

第三步:配置curl的信息post提交到java接口对应的action中。

将上传的文件写入到指定目录

    /**
     * 保存搜索图片
     * 将上传的查询图片存起 /根目录/searchImg/×××.jpg 
     * 便于javaweb端可以调到图片信息(将图片转成数据传递时会报错404,暂没解决,所以用这种,后期可以优化)
     * 
     * @return String
     * @author cdy
     * @date 2013-12-9 下午01:48:51
     */
    public static function save_search_img()
    {
        import('image.func');
        // 图片支持类型
        $support_img_type = array("image/gif","image/jpeg","image/png",
                                  "image/pjpeg");
        
        // 图片最大
        $img_max_size = 2000000;
        
        // 上传文件的格式和大小限制
        if (in_array($_FILES["imgFile"]["type"], $support_img_type) &&
            ($_FILES["imgFile"]["size"] < $img_max_size))
        {
            if ($_FILES["imgFile"]["error"] > 0)
            {
                trigger_error("搜索图片上传异常!");
                return "";
            }
            else
            {
                if (!is_dir(ROOT_PATH."/searchImg"))
                {
                    $oldumask=umask(0);
                    @mkdir(ROOT_PATH."/searchImg", "0777",true);
                    umask($oldumask);
                }
                
                // 获取图片类型,拼接文件名:日期+随机4位数+".文件后缀名"
                $tempName = gmdate("YmdHis", gmtime()+3600*8);
                $tempName .= mt_rand(1000, 9999);
                $tempNameArr = explode(".", $_FILES["imgFile"]["name"]);
                if (count($tempNameArr) > 1)
                {
                    $tempName .= ".".$tempNameArr[count($tempNameArr)-1];
                }
                else
                {
                    trigger_error("上传的搜索图片格式不正确!");
                    $tempName .= "jpeg"; 
                    return ;
                }
                $search_img_name = ROOT_PATH."/searchImg/". $tempName;
                if (file_exists($search_img_name)) // 如果文件存在,则删除掉(确保查询时是新文件)
                {
                    unlink($search_img_name);
                }
                // 将查询文件存起来
                @move_uploaded_file($_FILES["imgFile"]["tmp_name"],$search_img_name);
                
                // 生成缩略图
                $thumbnail = dirname($search_img_name) . '/small_' . basename($search_img_name);
                make_thumb($search_img_name, $thumbnail, 300, 300, 90, true);
                return $thumbnail;
            }
        }
        else
        {
            if (!in_array($_FILES["imgFile"]["type"], $support_img_type))
            {
                trigger_error("不支持".$_FILES["imgFile"]["type"]."类型的图片搜索!");
            }
            elseif ($_FILES["imgFile"]["size"] >= $img_max_size)
            {
                trigger_error("上传搜索图片大小".$_FILES["imgFile"]["size"]."超过图片最大限制".$img_max_size);
            }
        }
    }
备注:生成缩略图的代码是调用其他封装好方法的,这里暂不贴了(有兴趣的可以谷歌百度下)
// 将上传的搜索图片写入到项目指定的文件目录内
        $search_img_name = SolrSearch::save_search_img();
        
        // curl将上传文件作为参数POST方式调用Lire项目的接口,获取图片搜索结果
        $curl_val = "http://localhost:8080/eellysearch/imageSearchJson.action";
        $curl_file_data = array(
            "uploadImg"  => "@".$search_img_name, //(这里需要注意:不能上传临时地址,而只能是存在的物理绝对路径)
            "imgSearchType" => "2",
        );
        $ch=curl_init();
        curl_setopt($ch, CURLOPT_URL, $curl_val);
        curl_setopt($ch, CURLOPT_POST, 1 );
        curl_setopt($ch, CURLOPT_POSTFIELDS, $curl_file_data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/4.0");
        $responseStr = curl_exec($ch);
        curl_close($ch);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值