>php教程 >php手册 >PHP move_uploaded_file 함수가 사진을 이동하지 못하는 문제 해결

PHP move_uploaded_file 함수가 사진을 이동하지 못하는 문제 해결

WBOY
WBOY원래의
2016-10-08 16:04:421138검색

문제 설명:
오늘 사용자 등록 시 아바타 이미지 파일을 업로드하는 PHP 스크립트를 구현할 때 문제가 발생했습니다. PHP 스크립트는 이전에 결정되었습니다

브라우저 측에서 파일 업로드에 오류가 없습니다.
업로드된 파일은 합법적입니다.
업로드한 파일은 이미지 파일입니다.
서버 측에서 고유한 파일 이름이 생성되었습니다.
코드
다음으로 해야 할 일은 파일을 임시 위치에서 고정 위치로 옮기는 것이므로 다음과 같은 스크립트를 작성했습니다.

//임시 위치에서 고정 위치로 파일 이동 @move_uploaded_file($_FILES[$image_fieldname]['tmp_name'], $upload_filename) 또는 handler_error("이미지 파일 저장 중 오류가 발생했습니다.", "파일 이동 중 오류가 발생했습니다. " . "{ $upload_filename}");
코드 handler_error() 함수는 제가 직접 정의한 오류 처리 함수입니다. move_uploaded_file 함수에서 오류가 발생하면 오류 페이지로 점프합니다. 위 스크립트를 실행하면, 스크립트가 점프합니다. 오류 페이지에 도달했을 때 뭔가 잘못되었다는 것이 분명했습니다. 먼저 함수 매개변수에 오류가 있는지 확인했습니다.

$_FILES[$image_fieldname]['tmp_name']$upload_filename //직접 결합한 파일 경로이며 정확함을 보장합니다
PHP 매뉴얼에 따르면 함수에 전달한 위의 두 매개 변수는 다음과 같습니다. 문제는 무슨 일이 일어나고 있는 걸까요? 페이지에 오류가 보고되지 않았습니다. (함수 앞에 PHP의 "@" 연산자를 사용했기 때문에 페이지에서 오류를 보고하지 않습니다.)

@operator

참고: 코드에서 PHP의 @ 연산자를 사용할 때는 주의하세요.
@ 연산자는 잘못된 사용자 입력이나 SQL 쿼리에 잘못된 열 또는 불규칙한 URL 오류가 포함되어 있을 수 있는 모든 문제를 걸러낼 수 있습니다. 피할 수 있으며 코드는 사용자, 자체 또는 밴드에 의해 생성된 오류를 확인하지 못할 수도 있습니다. 간단히 말해서, @ 연산자는 단순히 충돌 또는 오류를 일으킬 수 없기 때문에 코드에서 오류 메시지를 가릴 수 있습니다. 정지되지만 이 경우 다른 오류 해결 옵션을 사용하십시오.

오류 로그 파일 찾기
당시에는 @ 연산자가 오류 메시지를 차단한 줄도 모르고 설정 시 사용했기 때문에 아파치의 오류 로그 파일을 찾아보고 싶었습니다. PHP 개발 환경입니다. xampp과 같은 개발 키트이므로 error_log 파일이 인터넷에 있는 대부분의 기사와 다릅니다. 결국
(내 호스트는 ubuntu입니다)

을 찾았습니다. php_error_log 파일은

/opt/lampp/logs
경로에서 발견되었습니다. 물론 Apache의 error_log 파일도 이 경로에 저장되어 있습니다. php_error_log 파일에서 권한 부족이라는 오류 문제를 확인했습니다. 마침내 오류를 발견했습니다. 장소: 이미지를 저장하는 대상 디렉터리에는 PHP를 실행하는 사용자에 대한 권한이 없습니다. PHP 스크립트를 실행하는 사용자는 스크립트 코드를 작성하고 이미지 폴더를 생성한 사용자와 동일하지 않습니다. >

사실 그렇게 번거로울 필요는 없습니다. 함수 앞의 @ 연산자만 제거한 다음 오류 처리 함수인 handler_error() 함수를 제거하면 오류 메시지를 볼 수 있습니다. 웹 페이지에서.

대상 폴더 권한 수정

무슨 일이 있어도 문제의 원인을 찾았는데, 폴더의 사용자와 권한이 잘못되었기 때문에 수정만 하면 됩니다. 이런 문제들:

이미지가 저장된 폴더의 소유자를 사용자로 수정하고, PHP 스크립트를 실행하기 위해 아파치를 실행하는 사용자로 변경합니다.

폴더 권한을 755로 변경하세요
아파치를 실행하는 사용자는 누구인가요? PHP 스크립트를 사용하여 다음을 얻습니다.

echo exec('whoami'); //파일을 실행할 사용자 이름을 가져와서 사진 폴더의 권한을 수정합니다

이런 식으로 스크립트를 실행한 사용자인 daemon을 얻었습니다. get은 나와 다를 가능성이 높습니다.
폴더를 소유한 사용자를 수정해 보겠습니다.

chown daemon -R ~/web/hello_php/uploads

~/web/hello_php/uploads는 이미지를 저장하는 대상 경로입니다. -R은 이 디렉터리에 있는 폴더의 사용자를 재귀적으로 수정한다는 의미입니다.

폴더 권한을 수정하세요

chmod 775 -R ~/web/hello_php/uploads

이제 끝났습니다.

참고자료 : http://www.manongjc.com/article/1494.html

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.