php如何上传图片到第三方API取返回地址

网上有找到一个源码,但是太花俏了,用的全是JS,我完全看不懂。
所以在这请教大哥们能帮我写个简单的,只需要提交上传取返回地址。
我菜鸟,太复杂看不懂!

https://sm.ms/api/upload 这是post API接口

这是提交参数描述

 参数名称   类型  是否必须    描述
smfile  File    是 表单名称。上传图片用到
ssl Bool    否 是否使用 https 输出,强制开启
format  String  否 输出的格式。可选值有 json、xml。默认为 json

这是返回值

名称  类型  示例值   描述
code    String  success 上传文件状态。正常情况为 success。出现错误时为 error
filename    String  smms.jpg    上传文件时所用的文件名
storename   String  561cc4e3631b1.png   上传后的文件名
size    Int 187851  文件大小
width   Int 1157    图片的宽度
height  Int 680 图片的高度
hash    String  nLbCw63NheaiJp1 随机字符串,用于删除文件
delete  String  https://sm.ms/api/delete/nLbCw63NheaiJp1    删除上传的图片文件专有链接
url String  https://ooo.0o0.ooo/2015/10/13/561cfc3282a13.png    图片服务器地址
path    String  /2015/10/13/561cfc3282a13.png   图片的相对地址
msg String  No files were uploaded. 上传图片出错时将会出现 

问题已解决!!!!!!!!!!!!!!

图片说明

5个回答

 <?php
$url = "https://sm.ms/api/upload";
$post_data = array(
"smfile" => "@".str_replace("\\","/",realpath("1.gif"))
);
$ch = curl_init();
curl_setopt($ch , CURLOPT_URL , $url);
curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch , CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch , CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$output = curl_exec($ch);
curl_close($ch);
if( $output!==false){
$obj=json_decode($output,true);
echo $obj['data']['url'];
}
else echo "提交失败!";
?>
showbo
支付宝加好友偷能量挖,胡杨在等着我的召唤 回复weixin_41959390: 或者参考这个,直接构造POST信息体,POST到接口。我这里php5.3测试可以。http://www.w3dev.cn/article/20180613/php-post-binary-data-to-api-url.aspx
大约 2 年之前 回复
weixin_41959390
梅川酷芷 嗯嗯
大约 2 年之前 回复
showbo
支付宝加好友偷能量挖,胡杨在等着我的召唤 回复weixin_41959390: move_uploaded_file保存你服务器的其他地方,然后curlfile用保存后的地址
大约 2 年之前 回复
showbo
支付宝加好友偷能量挖,胡杨在等着我的召唤 回复weixin_41959390: 是你,你要先保存到服务器,然后curlfile的参数为你保存的路径就行了。怪不得这个代码没效果,你的php是5.5以上的了吧,我的5.3的,没有curlfile对象。。
大约 2 年之前 回复
weixin_41959390
梅川酷芷 嗯,我的是放在服务器的,如果要传到API,首先要传到服务器,然后得到地址在传到API,是这个意思吧
大约 2 年之前 回复
showbo
支付宝加好友偷能量挖,胡杨在等着我的召唤 直接传tmp后缀校验会错误
大约 2 年之前 回复
showbo
支付宝加好友偷能量挖,胡杨在等着我的召唤 回复weixin_41959390: 获取客户端的没有意义的,安全问题也获取不到客户端路径。临时文件内容正确,后缀.tmp。这个啰嗦了。不行只能先保存到本地再上传到接口了
大约 2 年之前 回复
weixin_41959390
梅川酷芷 你意思先上传到我服务器,获取地址然后在传到API吗?
大约 2 年之前 回复
weixin_41959390
梅川酷芷 临时的文件格式不是图片格式呀,提交不到API
大约 2 年之前 回复
weixin_41959390
梅川酷芷 那怎么获取表单打开的绝对路径呢
大约 2 年之前 回复
showbo
支付宝加好友偷能量挖,胡杨在等着我的召唤 回复weixin_41959390: <form method="post" enctype="multipart/form-data" action="https://sm.ms/api/upload"><input type="file" name="smfile" /><input type="submit" /></form>这种?你可以提交你i自己的php,临时目录获取文件发送到接口也行的
大约 2 年之前 回复
weixin_41959390
梅川酷芷 获取不到返回值?
大约 2 年之前 回复
weixin_41959390
梅川酷芷 你给我的代码是绝对路径,表单的只有临时路径
大约 2 年之前 回复
weixin_41959390
梅川酷芷 不是,能获取到值,但是不知道怎么运用上去
大约 2 年之前 回复
showbo
支付宝加好友偷能量挖,胡杨在等着我的召唤 回复weixin_41959390: 表单你获取不到返回值。。
大约 2 年之前 回复
weixin_41959390
梅川酷芷 老大,怎么用表单file提交呢,不是直接用地址。
大约 2 年之前 回复
weixin_41959390
梅川酷芷 老大,我解决了问题了。看我修改了帖子有我最终的代码图。
大约 2 年之前 回复
weixin_41959390
梅川酷芷 我直接用表单提交到API ,不做任何处理是可以提交上去的。
大约 2 年之前 回复
weixin_41959390
梅川酷芷 我打印出来的
大约 2 年之前 回复
weixin_41959390
梅川酷芷 Array ( [smfile] => @E:/aci/1.jpg ) {"code":"error","msg":"No files were uploaded."} Notice: Undefined index: data in E:\aci\c.php on line 21
大约 2 年之前 回复
showbo
支付宝加好友偷能量挖,胡杨在等着我的召唤 回复weixin_41959390: 你用我的这个,需要有一张图片为1.gif,并且和php文件同一个目录下才能使用
大约 2 年之前 回复
weixin_41959390
梅川酷芷 我的是WINDOW 用的你最新的源码,
大约 2 年之前 回复
showbo
支付宝加好友偷能量挖,胡杨在等着我的召唤 这个我测试的,路径我自己本地的。你的是window还是unix系统。window用realpath转为物理路径后替换\为/。unix不太清楚路径格式。
大约 2 年之前 回复
showbo
支付宝加好友偷能量挖,胡杨在等着我的召唤 回复weixin_41959390: "smfile" => "@".str_replace("\\","/",realpath("1.gif"))改成你本地文件路径啊
大约 2 年之前 回复
weixin_41959390
梅川酷芷 老大我打印$output 这个变了返回的是{"code":"error","msg":"No files were uploaded."}
大约 2 年之前 回复
weixin_41959390
梅川酷芷 回复showbo: 老大,报错呀,你帮我看看
大约 2 年之前 回复
showbo
支付宝加好友偷能量挖,胡杨在等着我的召唤 回复weixin_41959390: 记得采纳了:)。。
大约 2 年之前 回复
weixin_41959390
梅川酷芷 谢谢老大,每次都是你帮我解决问题。。。。
大约 2 年之前 回复

CURL DEMO
function curl_post_https($url,$data){ // 模拟提交数据函数
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
$tmpInfo = curl_exec($curl); // 执行操作
if (curl_errno($curl)) {
echo 'Errno'.curl_error($curl);//捕抓异常
}
curl_close($curl); // 关闭CURL会话
return $tmpInfo; // 返回数据,json格式
}
$data就是POST的数据 可以是file
你自己抓包跟着写就行 这样还不会的话 可以考虑转行了 curl功能开启要在ini配置文件取消注释

weixin_41959390
梅川酷芷 帮我看看呗
大约 2 年之前 回复
weixin_41959390
梅川酷芷 怎么指定提交到smfile这个参数
大约 2 年之前 回复
weixin_41959390
梅川酷芷 感谢
大约 2 年之前 回复

$url = "https://sm.ms/api/upload";
$post_data = array(
"smfile" => "@".str_replace("\\","/",realpath("a.txt"))
);
$ch = curl_init();
curl_setopt($ch , CURLOPT_URL , $url);
curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch , CURLOPT_POST, 1);
curl_setopt($ch , CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$output = curl_exec($ch);

curl_close($ch);
echo $output;
weixin_41959390
梅川酷芷 而且,API返回的是错误代码,code] => error [msg] => No files were uploaded.
大约 2 年之前 回复
weixin_41959390
梅川酷芷 图片地址是改了我本地物理地址,用的也是你最新发的,运行报错,我打印$obj 是空的
大约 2 年之前 回复
showbo
支付宝加好友偷能量挖,胡杨在等着我的召唤 回复weixin_41959390: 还有图片路径要改为你本地的物理路径,图片。。。传其他的会出错
大约 2 年之前 回复
showbo
支付宝加好友偷能量挖,胡杨在等着我的召唤 回复weixin_41959390: 传图片,看我最新发的,要添加useragent
大约 2 年之前 回复
weixin_41959390
梅川酷芷 老大,我打印出来是空的。Array ( [code] => error [msg] => No files were uploaded. )
大约 2 年之前 回复
weixin_41959390
梅川酷芷 回复showbo: Notice: Undefined index: data in E:\aci\c.php on line 18 老大,复制你的过来报错了
大约 2 年之前 回复
showbo
支付宝加好友偷能量挖,胡杨在等着我的召唤 要添加USER-AGENT,要不不给请求。。curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
大约 2 年之前 回复

@qq_24597781
看看哪里有问题呀。

 <?php
function curl_post_https($url,$data){ // 模拟提交数据函数
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
$tmpInfo = curl_exec($curl); // 执行操作
if (curl_errno($curl)) {
echo 'Errno'.curl_error($curl);//捕抓异常
}
curl_close($curl); // 关闭CURL会话
return $tmpInfo; // 返回数据,json格式
}
 if (isset($_FILES['smfile'])){
    $smfile=$_FILES['smfile'];
echo curl_post_https("https://sm.ms/api/upload",$smfile);
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />  
<title></title>   
</head>
<body>
<form  method="post" enctype="multipart/form-data">  
<input name="smfile" type="file"/><input name="" type="submit" value="上传" />  
</form> 
</body>  
</html>  

![图片说明](https://img-ask.csdn.net/upload/201806/13/1528862334_977110.jpg)图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问