PHP의 form POST에서 cURL을 통해 파일 보내기
PHPPHP의 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.다음은 파일을 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.이 게시물을 찾고 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.이 작동합니다.
이 작동합니다.
$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.나의 @ 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.그것은 메시징 시스템을 통해 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.
$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.우리는 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.여기에 내 솔루션입니다, 나는 많은 게시물을 읽고 그들이 정말 도움이되었다, 마침내 내가 작은 파일에 대한 코드를 빌드, 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와 컬 라이브러리에서 어떻게 작동 하는지를 이해하는 데 정말로 도움이됩니다.
내 최고의 감사합니다,
제 영어에 대한 사과는 제 모국어가 아닙니다.
from https://stackoverflow.com/questions/4223977/send-file-via-curl-from-form-post-in-php by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
PDO :: fetchAll 대 PDO :: 루프에서 가져 오기 (0) | 2018.09.20 |
---|---|
태그 / 성능 열기 / 닫기? (0) | 2018.09.20 |
이전 인증을 사용하는 MySQL 4.1 이상에 연결할 수 없습니다 (0) | 2018.09.20 |
PHP는 파일이나 호출 코드에 상대적인 경로를 포함하고 있습니까? (0) | 2018.09.20 |
내 PHP 앱에서 404 오류를 보내지 않는 이유는 무엇입니까? (0) | 2018.09.20 |