如何用PHP从HTML表单传图片至服务器/API?视觉API调用报错求助
问题排查与解决方法
Hey,咱们一步一步来搞定这个问题!你遇到的NotSupportedVisualFeature错误,核心原因其实很明确——请求URL里的视觉特征参数编码出问题了。
错误根源分析
看你代码里的请求URL:
https://microsoft-azure-microsoft-computer-vision-v1.p.rapidapi.com/analyze?visualfeatures=Categories%252CTags%252CColor%252CFaces%252CDescription
这里的%252C是逗号(,)被双重URL编码后的结果:正常情况下,逗号的URL编码是%2C,但你这里把%又额外编码成了%25,导致API完全识别不了你指定的视觉特征类型,所以才会抛出“特征类型无效”的错误。
解决步骤
- 修正URL的参数编码
把URL里的%252C替换成普通逗号(,)或者单次编码的%2C,两种格式API都能正确解析。比如修改后的URL可以是:
https://microsoft-azure-microsoft-computer-vision-v1.p.rapidapi.com/analyze?visualfeatures=Categories,Tags,Color,Faces,Description
- 规范文件字段名(可选但建议)
根据Microsoft Computer Vision API的要求,上传本地图片时,表单字段名应该是image而不是你用的myimage。虽然这不是当前报错的直接原因,但为了避免后续潜在问题,建议调整这部分代码:
把
$data = array('myimage' => $cfile);
改成
$data = array('image' => $cfile);
修正后的完整代码
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST" enctype="multipart/form-data"> <input type="file" name="image" required> <input type="submit" name="submit"> </form> <?php if(isset($_POST['submit'])){ $curl = curl_init(); $cfile = new CURLFile($_FILES['image']['tmp_name'], $_FILES['image']['type'], $_FILES['image']['name']); $data = array('image' => $cfile); curl_setopt_array($curl, array( CURLOPT_URL => "https://microsoft-azure-microsoft-computer-vision-v1.p.rapidapi.com/analyze?visualfeatures=Categories,Tags,Color,Faces,Description", CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 300, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => $data, CURLOPT_HTTPHEADER => array( "content-type: multipart/form-data", "x-rapidapi-host: microsoft-azure-microsoft-computer-vision-v1.p.rapidapi.com", "x-rapidapi-key: b57a0cbabamshcc6da139552c381p1c550ajsn17605aa32e55" ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } } ?>
内容的提问来源于stack exchange,提问作者SAMEER KUMAR
相关产品推荐
相关产品推荐

