您的位置:首页 > 编程语言 > PHP开发

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

2013-12-30 11:47 756 查看
背景:图片搜索的项目中,因为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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: