2017-12-13 22 views
-1

Curlを使用してファイルアップロードREST APIを呼び出しようとしていますが、空白の画面が返されます。 ファイルアップロードAPIは、成功した場合にファイル名を返します。 同じこと、私はpostmanツールを使用してfule upload rest apiを呼び出すことができます。CURL Fileupload REST API

エラー:

{ 
    "Message": "An error has occurred.", 
    "ExceptionMessage": "Sequence contains no matching element", 
    "ExceptionType": "System.InvalidOperationException", 
    "StackTrace": " at System.Linq.Enumerable.First[TSource](IEnumerable`1 source, Func`2 predicate)\r\n at PharmaRackv2.WebUI.Areas.Admin.Controllers.UploadController.d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Threading.Tasks.TaskHelpersExtensions.d__3`1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()" 
} 

PHPコード:

try { 
      $file = "D:\xampp\htdocs\api.pharmarack.com\distributors\11380\08122017123602.zip"; 
      $curl = curl_init(); 
      curl_setopt_array($curl, array(
       CURLOPT_URL => "http://test.com/api/upload", 
       CURLOPT_RETURNTRANSFER => true, 
       CURLOPT_ENCODING => "", 
       CURLOPT_MAXREDIRS => 10, 
       CURLOPT_TIMEOUT => 30, 
       CURLOPT_CUSTOMREQUEST => "POST", 
       CURLOPT_POSTFIELDS => array(
       'attachment' => curl_file_create($file), 
      ), 
       CURLOPT_HTTPHEADER => array(
        "cache-control: no-cache", 
        "content-type: multipart/form-data", 
        "distributorcode: 1HUBH", 
        "foldername: 1HUBH" 
       ), 
      )); 

      $response = curl_exec($curl); 
      $err = curl_error($curl); 

      curl_close($curl); 

      if ($err) { 
       echo "cURL Error #:" . $err; 
      } else { 
       echo $response; 
      } 
     } catch (Exception $e) { 
      echo 'Message: ' . $e->getMessage(); 
     } 

POSTMANのCALL それが正常に動作しています。成功した場合、ファイルアップロードAPIはファイル名を返します。 enter image description here enter image description here

答えて

2

問題は、あなたのカールのエラーを取得している理由です、DistributorCodeFolderNameは大文字と小文字を区別していることです。以下のようにすることを修正する:

CURLOPT_HTTPHEADER => array(
    "cache-control: no-cache", 
    "content-type: multipart/form-data", 
    "DistributorCode: 1HUBH", 
    "FolderName: 1HUBH" 
), 

編集:問題はmultipart/form-dataは、あなたがboundriesを介してデータを送信する必要があると、あなたはいつものポストのparamのように、file=abc.phpのようにそれを送ることができないということです。

<?php 
$curl = curl_init(); 

curl_setopt_array($curl, array(
    CURLOPT_URL => "http://ragabh.com/api/upload", 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_ENCODING => "", 
    CURLOPT_MAXREDIRS => 10, 
    CURLOPT_TIMEOUT => 30, 
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 
    CURLOPT_CUSTOMREQUEST => "POST", 
    CURLOPT_POSTFIELDS => "------FormData\r\nContent-Disposition: form-data; name=\"attachment\"; filename=\"E:\\c5-500x500.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------FormData--", 
    CURLOPT_HTTPHEADER => array(
    "cache-control: no-cache", 
    "content-type: multipart/form-data; boundary=----FormData", 
    "DistributorCode: 1HUBH", 
    "FolderName: 1HUBH", 
), 
)); 

$response = curl_exec($curl); 
$err = curl_error($curl); 

curl_close($curl); 

if ($err) { 
    echo "cURL Error #:" . $err; 
} else { 
    echo $response; 
}