2015-01-17 4 views
1

좀 이상한 문제가 발생했는데 누군가가 어떤 상황인지 알기를 바랍니다.첫 번째 파일 업로드 후 PHP 스크립트가 작동하지 않습니다.

git에서 프로젝트를 복제하고 PHPStorm에서 작업을 시작하여 로컬 Apache 서버에서 실행했습니다. 그래서 처음에는 작동했지만, 다음 시도에서는 스크립트가 응답하지 않았습니다. 아파치를 다시 시작하면 IDE에서 스크립트를 다시 실행하는 데 도움이되지 않습니다. 브라우저 콘솔/리소스에 대한 정보가 없습니다.

나는이 헤더에 문제가 있다고 결정했습니다, 그리고 스크립트를 다시 썼다

$fileInputName = 'uploadedFile'; 
if (!array_key_exists($fileInputName, $_FILES)) { 
    echo ('there are no files to work with'); 
    die(); 
} 
$uploadName = $_FILES[$fileInputName]['tmp_name']; 
$size = $_FILES[$fileInputName]['size']; 
$pathToSaveSVG = realpath(dirname(__FILE__)) . '/SVG'; 

$fileName = $uploadName . '.pdf'; 
$targetName = $fileName . '.svg'; 

if (!move_uploaded_file($uploadName, $fileName)) { 
    echo ($uploadName. ' '. $fileName); 
    unlink($uploadName); 
    echo('can\'t move uploaded file'); 
    die(); 
} 

exec('pdf2svg ' . escapeshellarg($fileName) . ' ' . escapeshellarg($pathToSaveSVG. '/' . $targetName)); 
unlink($fileName); 

echo $pathToSaveSVG . '/' . $targetName; 
die; 

HTML은 :

<form action="pdf_to_svg.php" method="POST" enctype="multipart/form-data"> 
    <input type="hidden" name="MAX_FILE_SIZE" value="1000000" /> 
    <input type="file" name="uploadedFile" id="file" accept="application/pdf" /> 
    <input type="submit" name="submit" value="Convert " /> 
</form> 

다음에, 반복합니다. 스크립트는 POST 데이터를 보내는 것이 아니라 이름으로 변환하는 파일을 가져가는 것이 좋습니다.

POST 메서드를 통해 데이터를 보내면 왜 두 번째로 스크립트가 작동하지 않습니까? 그것은 서버 측이나 무언가에서 순환 포워딩처럼 보이지만 오류는 보이지 않으며 아파치 로그에서도 마찬가지입니다.

ADD : 권한과 관련된 것 같습니다. 처음에는 오류 3 - 파일이 포함 된 파일 업로드가 부분적으로 업로드되었습니다. chmod 755 -R ./SVG을 시도했지만 결과가 없습니다. 누군가 나를 알아낼 수있게 도와 줄 수 있습니까?

+0

브라우저 네트워킹 도구를 살펴본 후 브라우저의 최대 스크립트 실행 후 브라우저가 응답을 기다리고있는 것처럼 일반적인 것을 보았습니까? 추신 : 에코는 언어 구조 * 함수가 아니므로 대괄호()를 제거해야합니다. –

+0

또한 exec() 대신 shell_exec()를 사용하고 응답을 캡처하십시오. SSH를 통해 서버에 연결하고 pdf2svg가 실행되기 시작할 때'top'을 사용하십시오. –

+0

@CharlotteDunois 덕분에 PHP 개발자는 아니지만 나중에이 문제를 해결합니다. 브라우저는 'Waiting for localhost ...'라고 씁니다. 그러나 도구에는 절대 정보가 없습니다. –

답변

0

답을 찾았습니다. 파일을 서버에 업로드 할 때 apache는 /var/tmp과 같은 임시 디렉토리에 파일을 저장하려고합니다. www-data에는 해당 디렉토리에서 읽고 쓸 수있는 권리가 있으며, 이것이 내가 막힌 이유입니다. 프로젝트가 /var/www이 아니며 PhpStorm 도구로 실행했습니다. 궁금 해서요, 왜 작동하지 않았습니까? www-data 그룹에는 프로젝트 폴더와 임시 폴더에 대한 모든 권한이 있습니다. 그런데 내 스크립트에서 시도했습니다.

그리고 www-data가 아닌 내 사용자 이름이 반환되었습니다.나는 단순히

www-data:x:33:myUserName 

/etc/group 파일

www-data:x:33 

을 변경하고 지금은 작동합니다.

0

파일 업로드 양식의 속성이 enctype="multipart/form-data"
인지 확인하십시오. 그렇지 않으면 파일 업로드가 올바르게 작동하지 않을 수 있습니다.

memory_limit를 충분히 크게 설정해야합니다.

max_execution_time을 충분히 크게 설정했는지 확인하십시오.

post_max_size를 충분히 크게 설정해야합니다.

확인 핵심 가치 :

phpinfo(); 

자격은 업로드 오류 없었고

if(is_uploaded_file($_FILES['uploadedFile']['tmp_name']) || !($_FILES['uploadedFile']['error'] !== UPLOAD_ERR_OK) && strtolower($_FILES['uploadedFile']['type']) == 'application/pdf')){ 

는 간부의 반환 된 상태 가져 오기 올바른 컨텐츠 MIME 유형이 있습니다

$status = exec(...); 
echo "<p>$status</p>"; 

대상 경로 및 파일 이름이 정확합니다.

if (file_exists($fileName) && file_exists($pathToSaveSVG)){ 
+0

분 전에 언급했듯이 코드 3에 오류가 있습니다. 처음에는 'tmp_name'키가없고 'size'가 0과 같습니다. 이미 아파치 권한을 변경했습니다. http : // stackoverflow. co.kr/questions/8457683/php-move-uploaded-file-fail-and-i-dont-know- why,하지만 여전히 작동하지 않습니다. –

+0

@realvladi www-data (웹 서버를 실행하는 사용자)가 디렉토리의 소유자가 아닌 경우 디렉토리는 766의 chmod가 필요합니다. http://en.wikipedia.org/wiki/File_system_permissions#Numeric_notation –

+0

메모리 검사, 최대 파일 크기,'phpinfo()'와 함께 execution_time. 'Content Type multipart/form-data'에 대한 응답 헤더를 확인하십시오. – Misunderstood

관련 문제