복붙노트

PHP의 form POST에서 cURL을 통해 파일 보내기

PHP

PHP의 form POST에서 cURL을 통해 파일 보내기

API를 작성 중이며 양식 POST에서 파일 업로드를 처리하려고합니다. 양식의 마크 업은 너무 복잡하지 않습니다.

<form action="" method="post" enctype="multipart/form-data">
  <fieldset>
    <input type="file" name="image" id="image" />
    <input type="submit" name="upload" value="Upload" />
  </fieldset>
</form>

그러나이 서버 측을 처리하고 cURL 요청과 함께 보내는 방법을 이해하는 데 어려움을 겪고 있습니다.

저는 데이터 배열이있는 cURL을 사용하여 POST 요청을 보내는 것에 익숙하며 파일 업로드시 읽은 리소스는 파일 이름 앞에 @ 기호를 붙이라고 알려줍니다. 그러나 이러한 동일한 리소스에는 파일 이름이 하드 코딩되어 있습니다.

$post = array(
    'image' => '@/path/to/myfile.jpg',
    ...
);

그럼 어떤 파일 경로입니까? 어디서 찾을 수 있니? 그것은 $ _FILES [ 'image'] [ 'tmp_name']과 같은 것이 겠지요.이 경우 my $ post 배열은 다음과 같이 보일 것입니다 :

$post = array(
    'image' => '@' . $_FILES['image']['tmp_name'],
    ...
);

아니면 잘못된 방향으로 가고 있습니까? 어떤 충고라도 가장 감사 할 것입니다.

편집 : 누군가가 나에게 다음 코드 스 니펫을 가지고 갈 코드 조각을 줄 수 있다면 가장 감사하게 생각한다. 저는 주로 cURL 매개 변수로 보내야 할 것이고, 수신 스크립트에서 이러한 매개 변수를 사용하는 방법에 대한 샘플입니다 (인수로 curl_receiver.php라고 부르 자).

나는이 웹 양식을 가지고있다 :

<form action="script.php" method="post" enctype="multipart/form-data">
  <fieldset>
    <input type="file" name="image />
    <input type="submit" name="upload" value="Upload" />
  </fieldset>
</form>

그리고 이것은 script.php가 될 것입니다 :

if (isset($_POST['upload'])) {
    // cURL call would go here
    // my tmp. file would be $_FILES['image']['tmp_name'], and
    // the filename would be $_FILES['image']['name']
}

해결법

  1. ==============================

    1.다음은 파일을 ftp로 보내는 일부 프로덕션 코드입니다 (사용자를위한 좋은 해결책 일 수 있음).

    다음은 파일을 ftp로 보내는 일부 프로덕션 코드입니다 (사용자를위한 좋은 해결책 일 수 있음).

    // This is the entire file that was uploaded to a temp location.
    $localFile = $_FILES[$fileKey]['tmp_name']; 
    
    $fp = fopen($localFile, 'r');
    
    // Connecting to website.
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_USERPWD, "email@email.org:password");
    curl_setopt($ch, CURLOPT_URL, 'ftp://@ftp.website.net/audio/' . $strFileName);
    curl_setopt($ch, CURLOPT_UPLOAD, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 86400); // 1 Day Timeout
    curl_setopt($ch, CURLOPT_INFILE, $fp);
    curl_setopt($ch, CURLOPT_NOPROGRESS, false);
    curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'CURL_callback');
    curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
    curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localFile));
    curl_exec ($ch);
    
    if (curl_errno($ch)) {
    
        $msg = curl_error($ch);
    }
    else {
    
        $msg = 'File uploaded successfully.';
    }
    
    curl_close ($ch);
    
    $return = array('msg' => $msg);
    
    echo json_encode($return);
    
  2. ==============================

    2.이 게시물을 찾고 PHP5.5 +를 사용하는 사람들에게 도움이 될 것입니다.

    이 게시물을 찾고 PHP5.5 +를 사용하는 사람들에게 도움이 될 것입니다.

    netcoder가 제안한 접근 방식이 작동하지 않는다는 것을 알았습니다. 즉 이것이 작동하지 않습니다.

    $tmpfile = $_FILES['image']['tmp_name'];
    $filename = basename($_FILES['image']['name']);
    $data = array(
        'uploaded_file' => '@'.$tmpfile.';filename='.$filename,
    );
    $ch = curl_init();   
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    

    나는 $ _POST var에서 'uploaded_file'필드를받을 것이고 $ _FILES var에 아무것도 넣지 않을 것입니다.

    php5.5 +에는 새로운 curl_file_create () 함수가 필요하다는 것이 밝혀졌습니다. 따라서 위의 내용이됩니다.

    $data = array(
        'uploaded_file' => curl_file_create($tmpfile, $_FILES['image']['type'], $filename)
    );
    

    @ 형식은 이제 더 이상 사용되지 않습니다.

  3. ==============================

    3.이 작동합니다.

    이 작동합니다.

    $tmpfile = $_FILES['image']['tmp_name'];
    $filename = basename($_FILES['image']['name']);
    
    $data = array(
        'uploaded_file' => '@'.$tmpfile.';filename='.$filename,
    );
    
    $ch = curl_init();   
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    // set your other cURL options here (url, etc.)
    
    curl_exec($ch);
    

    수신 스크립트에서 다음을 수행합니다.

    print_r($_FILES);
    /* which would output something like
         Array (
            [uploaded_file] => Array (
                [tmp_name] => /tmp/f87453hf
                [name] => myimage.jpg
                [error] => 0
                [size] => 12345
                [type] => image/jpeg
            )
         )
    */
    

    그런 다음 파일 업로드를 제대로 처리하려면 다음과 같이하십시오.

    if (move_uploaded_file($_FILES['uploaded_file'], '/path/to/destination/file.zip')) {
       // do stuff
    }
    
  4. ==============================

    4.나의 @ the 기호가 작동하지 않았다. 그래서 나는 약간의 조사를하고,이 길을 발견했다. 그리고 그것은 나를 위해 일한다, 나는 이것이 당신을 도와주기를 바란다.

    나의 @ the 기호가 작동하지 않았다. 그래서 나는 약간의 조사를하고,이 길을 발견했다. 그리고 그것은 나를 위해 일한다, 나는 이것이 당신을 도와주기를 바란다.

        $target_url = "http://server:port/xxxxx.php";           
        $fname = 'file.txt';   
        $cfile = new CURLFile(realpath($fname));
    
            $post = array (
                      'file' => $cfile
                      );    
    
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $target_url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");   
        curl_setopt($ch, CURLOPT_HTTPHEADER,array('Content-Type: multipart/form-data'));
        curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);   
        curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);  
        curl_setopt($ch, CURLOPT_TIMEOUT, 100);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    
        $result = curl_exec ($ch);
    
        if ($result === FALSE) {
            echo "Error sending" . $fname .  " " . curl_error($ch);
            curl_close ($ch);
        }else{
            curl_close ($ch);
            echo  "Result: " . $result;
        }   
    
  5. ==============================

    5.그것은 메시징 시스템을 통해 Mercadolibre에 첨부 파일을 보낼 때 저에게 효과적입니다.

    그것은 메시징 시스템을 통해 Mercadolibre에 첨부 파일을 보낼 때 저에게 효과적입니다.

    anwswer https://stackoverflow.com/a/35227055/7656744

    $target_url = "http://server:port/xxxxx.php";           
    $fname = 'file.txt';   
    $cfile = new CURLFile(realpath($fname));
    
        $post = array (
                  'file' => $cfile
                  );    
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $target_url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");   
    curl_setopt($ch, CURLOPT_HTTPHEADER,array('Content-Type: multipart/form-data'));
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);   
    curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);  
    curl_setopt($ch, CURLOPT_TIMEOUT, 100);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    
    $result = curl_exec ($ch);
    
    if ($result === FALSE) {
        echo "Error sending" . $fname .  " " . curl_error($ch);
        curl_close ($ch);
    }else{
        curl_close ($ch);
        echo  "Result: " . $result;
    }   
    
  6. ==============================

    6.

    $file = curl_file_create('full path/filename','extension','filename');
    
    $file = new CURLFile('full path/filename','extension','filename');
    
    $post= array('file' => $file);
    
    $curl = curl_init();  
    //curl_setopt ... 
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    $response = curl_exec($curl);
    curl_close($curl);
    
  7. ==============================

    7.우리는 base64 문자열로 변환하여 컬 요청으로 이미지 파일을 업로드 할 수 있습니다. 포스트에서 우리는 파일 문자열을 보내고 이것을 이미지로 변환 할 것입니다.

    우리는 base64 문자열로 변환하여 컬 요청으로 이미지 파일을 업로드 할 수 있습니다. 포스트에서 우리는 파일 문자열을 보내고 이것을 이미지로 변환 할 것입니다.

    function covertImageInBase64()
    {
        var imageFile = document.getElementById("imageFile").files;
        if (imageFile.length > 0)
        {
            var imageFileUpload = imageFile[0];
            var readFile = new FileReader();
            readFile.onload = function(fileLoadedEvent) 
            {
                var base64image = document.getElementById("image");
                base64image.value = fileLoadedEvent.target.result;
            };
            readFile.readAsDataURL(imageFileUpload);
        }
    }
    

    그것을 컬 요청으로 보낸다.

    if(isset($_POST['image'])){
        $curlUrl='localhost/curlfile.php';  
        $ch = curl_init();
        curl_setopt($ch,CURLOPT_URL, $curlUrl);
        curl_setopt($ch,CURLOPT_POST, 1);
        curl_setopt($ch,CURLOPT_POSTFIELDS, 'image='.$_POST['image']);
        $result = curl_exec($ch);
        curl_close($ch);
    }
    

    http://technoblogs.co.in/blog/How-to-upload-an-image-by-using-php-curl-request/118 여기를 참조하십시오.

  8. ==============================

    8.여기에 내 솔루션입니다, 나는 많은 게시물을 읽고 그들이 정말 도움이되었다, 마침내 내가 작은 파일에 대한 코드를 빌드, cUrl과 PHP는, 그게 정말 유용하다고 생각합니다.

    여기에 내 솔루션입니다, 나는 많은 게시물을 읽고 그들이 정말 도움이되었다, 마침내 내가 작은 파일에 대한 코드를 빌드, cUrl과 PHP는, 그게 정말 유용하다고 생각합니다.

    public function postFile()
    {
    
    
            $file_url = "test.txt";  //here is the file route, in this case is on same directory but you can set URL too like "http://examplewebsite.com/test.txt"
            $eol = "\r\n"; //default line-break for mime type
            $BOUNDARY = md5(time()); //random boundaryid, is a separator for each param on my post curl function
            $BODY=""; //init my curl body
            $BODY.= '--'.$BOUNDARY. $eol; //start param header
            $BODY .= 'Content-Disposition: form-data; name="sometext"' . $eol . $eol; // last Content with 2 $eol, in this case is only 1 content.
            $BODY .= "Some Data" . $eol;//param data in this case is a simple post data and 1 $eol for the end of the data
            $BODY.= '--'.$BOUNDARY. $eol; // start 2nd param,
            $BODY.= 'Content-Disposition: form-data; name="somefile"; filename="test.txt"'. $eol ; //first Content data for post file, remember you only put 1 when you are going to add more Contents, and 2 on the last, to close the Content Instance
            $BODY.= 'Content-Type: application/octet-stream' . $eol; //Same before row
            $BODY.= 'Content-Transfer-Encoding: base64' . $eol . $eol; // we put the last Content and 2 $eol,
            $BODY.= chunk_split(base64_encode(file_get_contents($file_url))) . $eol; // we write the Base64 File Content and the $eol to finish the data,
            $BODY.= '--'.$BOUNDARY .'--' . $eol. $eol; // we close the param and the post width "--" and 2 $eol at the end of our boundary header.
    
    
    
            $ch = curl_init(); //init curl
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                             'X_PARAM_TOKEN : 71e2cb8b-42b7-4bf0-b2e8-53fbd2f578f9' //custom header for my api validation you can get it from $_SERVER["HTTP_X_PARAM_TOKEN"] variable
                             ,"Content-Type: multipart/form-data; boundary=".$BOUNDARY) //setting our mime type for make it work on $_FILE variable
                        );
            curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/1.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0'); //setting our user agent
            curl_setopt($ch, CURLOPT_URL, "api.endpoint.post"); //setting our api post url
            curl_setopt($ch, CURLOPT_COOKIEJAR, $BOUNDARY.'.txt'); //saving cookies just in case we want
            curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // call return content
            curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); navigate the endpoint
            curl_setopt($ch, CURLOPT_POST, true); //set as post
            curl_setopt($ch, CURLOPT_POSTFIELDS, $BODY); // set our $BODY 
    
    
            $response = curl_exec($ch); // start curl navigation
    
         print_r($response); //print response
    
    }
    

    이것으로 우리는 다음 vars가 게시 된 "api.endpoint.post"에 올라 타야합니다. easly이 스크립트로 테스트 할 수 있습니다. 마지막 행의 함수 postFile ()에서이 디버그를 사용해야합니다.

    print_r ($ 응답); // 응답을 인쇄하십시오.

    public function getPostFile()
    {
    
        echo "\n\n_SERVER\n";
        echo "<pre>";
        print_r($_SERVER['HTTP_X_PARAM_TOKEN']);
        echo "/<pre>";
        echo "_POST\n";
        echo "<pre>";
        print_r($_POST['sometext']);
        echo "/<pre>";
        echo "_FILES\n";
        echo "<pre>";
        print_r($_FILEST['somefile']);
        echo "/<pre>";
    }
    

    여기서 당신은 좋은 일을해야하고, 더 나은 해결책이 될 수 있지만 이것이 효과적이며 경계와 멀티 파트 / 데이터 마임이 PHP와 컬 라이브러리에서 어떻게 작동 하는지를 이해하는 데 정말로 도움이됩니다.

    내 최고의 감사합니다,

    제 영어에 대한 사과는 제 모국어가 아닙니다.

  9. from https://stackoverflow.com/questions/4223977/send-file-via-curl-from-form-post-in-php by cc-by-sa and MIT license