2013-06-09 9 views
5

HTTP PUT을 사용하여 파일을 업로드하려고합니다.
비트를 읽은 후 $_FILES 배열은 POST와 multipart/form-data 인 것으로 보입니다. PUT을 사용하는 동안 데이터를 가져 오려면 php://input을 수동으로 읽어야합니다. 두 방법 모두 작동하지 않습니다. PHP로 파일 업로드시 Curl PUT 요청

나는 다음과 같은 옵션을 시도하고 당신이있을 어떤 조언을 부탁드립니다 :

curl --upload avatar.jpg http://api.test.com/user/dsadasdsa 
curl -X PUT -F "[email protected]" http://api.test.com/user/dsadasdsa 

내 PHP 파일이 인쇄하려고하지만 빈 문자열 반환 : 내가 생각하기 시작

echo file_get_contents("php://input"); 

을 이 Nginx 문제 누락 된 삭제 삭제 지원 및 설치된 nginx-extras뿐만 아니라 내 nginx 구성에 다음 추가하지만이 불행히도 도움이되지 않습니다.

root /var/www/; 

dav_methods PUT DELETE MKCOL COPY MOVE; 

create_full_put_path on; 
dav_access group:rw all:r; 
+0

* 참고 * http://php.net/manual/en/features.file-upload.put-method.php – Gordon

+0

@Gordon - 고마워요. 나는 그 페이지를 알고 있지만 PHP 측 (내가 이미하고있는)에서해야 할 일만 알려준다. 그리고 실제로 컬의 측면에서 내가 뭘 잘못하고 있는지 말해주지 않습니다. –

+0

또한 매뉴얼에서 똑같은 코드를 실행하려고하면 빈 파일이 생성됩니다. 따라서 CURL 요청이 잘못된 쪽임을 확신합니다. –

답변

3

디버깅에 대한 아이디어가 있습니다.

에코 대신 var_dump(file_get_contents('php://input'));을 수행하십시오. reference에 따르면 :

이 함수는 부울 FALSE를 반환 할 수 있지만 FALSE로 평가되는 부울이 아닌 값을 반환 할 수도 있습니다. 자세한 내용은 부울에 대한 절을 읽으십시오. 이 함수의 반환 값을 테스트하려면 === 연산자를 사용하십시오. 가장 가능성이 PHP 문제 - 당신은 출력으로 bool(false)을받을 경우

, 당신은 php://input를 읽을 수 있습니다 뭔가 문제가있다. string(0) ""을 얻는다면, php://input (더 이상?)에 아무 것도 없기 때문에 이것이 nginx 문제 일 가능성이 높아집니다.

또한 php:// reference에 따르면 php://inputenctype="multipart/form-data"과 함께 사용할 수 없습니다. 그걸 사용하지 않았습니까? HTML 파일을 익숙하게 사용해 볼 수도 있습니다.

기본적으로 오류 로그 /var/log/nginx/error.log을 확인할 수도 있습니다. 또한 HTTP 응답 코드를 확인하십시오. 200이야? 그렇지 않은 경우 유용한 코드입니까?

+0

불행히도 나는 아직 이것을 시험 할 기회를 얻지 못했지만, 당신의 대답은 지금까지 가장 철저한 것으로 보인다. 감사! –

+0

@ShaiMishali 테스트를 마친 후에 알려주십시오. 그리고 담당자에 대한 감사 : – Keelan

1

Nginx는 모든 http 동사 (put, delete, options 등)를 지원합니다. 그래서 당신은 nginx에서 특별한 설정이 필요하지 않습니다.

다음 작품

는 (내가 쉽게 테스트 할 수 php5.4 서버를 사용하고 있습니다) :

$putdata = fopen("php://input", "r"); 
while ($data = fread($putdata, 1024)) { 
     echo $data . "\n"; 
} 

시작 동일한 폴더에서 PHP 서버 put.php라는이 간단한 테스트 PHP 스크립트를 추가

php -S localhost:5000 

을 발행 PUT 요청 컬 :

curl -d "@/path/to/put.php" -X PUT http://localhost:5000/put.php 
01의 put.php

put의 파일 내용을 인쇄합니다.당신이 편안한 API를 사이트에 컬 요청을 보낼 PHP를 사용하려는 경우

PHP

[업데이트는, 내가있는 당신이 그 모두를 기억하지 않아도, Guzzle을 권하고 싶습니다 컬 옵션.

2

-F 옵션은 Content-Type multipart/form-data (man curl 참조)를 사용하여 POST 데이터에 컬을 발생시킵니다.

당신은에서 같이 --data 바이너리 옵션을 사용할 수 있습니다 :

curl -X PUT --data-binary "@avatar.jpg" http://api.test.com/user/dsadasdsa 

-d 옵션은 텍스트이며 손상 될 데이터.

내 테스트에서 다음 명령은 동일한 결과를 제공합니다. 여기

curl --upload "avatar.jpg" http://api.test.com/user/dsadasdsa 

내 서버

<?php 
echo "request method : " . $_SERVER['REQUEST_METHOD'] . "\n"; 
echo "dump files "; 
var_dump($_FILES); 

$putdata = fopen("php://input", "r"); 
while ($data = fread($putdata, 1024)) { 
     echo $data . "\n"; 
} 
?> 
0

당신이 서버에 PUT 요청을 만들려고하고 PHP는 래퍼에서 읽을 수없는 경우, 확인되었는지 :

  1. 당신은 PUT 요청이 맞습니다. 헤더 및 내용 (Making a PUT request with PHP and CURL)

  2. 서버가 PUT 요청을 수락합니다.

  3. 당신의 PHP 파일은 또한 체크 아웃 할 수 있습니다

(업로드 부분없이) 첫번째 간단한 PUT 요청을 읽을 수있는 '주의'는 PHP에 표시된 : // 입력 (http://php.net/manual/en/wrappers.php.php). 그 외에도 서버의 문제 일 수 있습니다.

0

두 가지 방법 내가 PHP와 DAV를 구현 해본 적이

작동하지 않습니다하지만 난의 nginx와 함께, 파일 업로드의 작품이 POST 말씀 드릴 수 있습니다.

컬 --upload avatar.jpg 나는이 일을 예상했을 것이다

http://api.test.com/user/dsadasdsa - 당신의 로그는 무엇을 보여주는가? '- 추적'을 시도 했습니까?

컬 넣어 -F -X "[email protected]"http://api.test.com/user/dsadasdsa

을 컬 -F 플래그는 POST 변수로 파일을 업로드하는 수단을 사용하여, 다중/폼 데이터를 이용 인코딩 - PUT 요청에 아무런 의미가 없습니다.

0

PHP를 nginx 뒤에 다른 종류의 webapp를 설치하고 PUT 업로드를 처리 할 수 ​​있는지 테스트하여 문제의 원인을 제거 했습니까? 매우 짧은 Python Flask 앱을 ​​사용하면 PUT 업로드를 다른 언어로 테스트 할 수 있습니다.