2017-09-23 8 views
1

"큰"파일을 내 응용 프로그램에 업로드하려고합니다. 사용자는 200MB보다 작은 비디오 파일을 업로드 할 수 있어야하지만 서버가 4MB 또는 30 초 후에 연결을 끊고 업로드가 실패한 것처럼 보입니다.30 초 업로드 후 Dropzone.js 업로드가 실패했습니다.

나는 이미 나의 php.ini 파일의 모든 매개 변수를 설정했습니다

max_input_time = 320
max_execution_time = 320
max_file_uploads = 20
memory_limit = 512M
post_max_size = 201M
upload_max_filesize = 200M

내가 업로드하면 모든 노력 에이 의 파일 2메가바이트 @ 1Mbps의/s의

라이브 php_info() 파일 php_info에 도달 될 수있다 여기에 비록

이 DropZone.js의 conf입니다 (파일 크기 또는 전송 시간에 관한 문제가 있다면 나도 몰라) :

<?php 
require_once '../db.config.php'; 

header('Content-Type: text/plain; charset=utf-8'); 

ini_set('upload_max_filesize', '200M'); 
ini_set('post_max_size', '201M'); 
ini_set('max_input_time', 320); 
ini_set('memory_limit', '256M'); 


try { 
    if (
     !isset($_FILES['file']['error']) || 
     is_array($_FILES['file']['error']) 
    ) { 
     throw new RuntimeException('Invalid parameters.'); 
    } 

    switch ($_FILES['file']['error']) { 
    case UPLOAD_ERR_OK: 
     break; 
    case UPLOAD_ERR_NO_FILE: 
     throw new RuntimeException('No file sent.'); 
     break; 
    case UPLOAD_ERR_INI_SIZE: 
     break; 
    case UPLOAD_ERR_FORM_SIZE: 
     throw new RuntimeException('Exceeded filesize limit.'); 
     break; 
    default: 
     throw new RuntimeException('Unknown errors.'); 
     break; 
} 

    // check filesize. 
    if ($_FILES['file']['size'] > 209715200) { 
     throw new RuntimeException('Exceeded filesize limit.'); 
    } 

    // Check MIME Type. 
    $finfo = new finfo(FILEINFO_MIME_TYPE); 
    if (false === $ext = array_search(
      $finfo->file($_FILES['file']['tmp_name']), 
      array(
       'mp4' => 'video/mp4', 
       'mov' => 'video/mov', 
       'avi' => 'video/avi', 
      ), 
      true 
     )) { 
     throw new RuntimeException('Invalid file format.'); 
    } 

    // name uniquely. 
    $fileName = sha1_file($_FILES['file']['tmp_name']); 
    if (!move_uploaded_file($_FILES['file']['tmp_name'], sprintf('/var/www/html/beta.vedocompro.it/web/webtemp/%s.%s', $fileName, $ext))) { 
     throw new RuntimeException('Failed to move uploaded file.'); 
    } 

    try { 

     $PDO = new PDO('mysql:host=' . $DB_HOST . ';dbname=' . $DB_NAME,$DB_USER,$DB_PASS); 
     $insert = $PDO->prepare("INSERT INTO `videos` (`id`, `aid`, `accepted`, `uid`, `dir`) VALUES (NULL, '0', '0', '0', $fileName);"); 
     $insert->execute(); 

     echo $fileName; 

    } catch(PDOException $exception) { 
     echo $exception; 
    } 



} catch (RuntimeException $e) { 

    echo $e->getMessage(); 

} 

그래서 모든 것이 괜찮을하지만 서버 나는 생각하지 않는다 (뭔가 잘못 후 연결을 끊도록 보인다 여기

$("#dZUpload").dropzone({ 
    url: "/ajax/admin/admin.acceptVideo.php", 
    maxFilesize: 209715200, 
    acceptedFiles: "video/*", 
    addRemoveLinks: true, 
    dataType: "HTML", 
    data: { id: '' }, 
    success: function (file, response, data) { 
     var imgName = response; 
     file.previewElement.classList.add("dz-success"); 
     $('#form_video').val(imgName); 
    }, 
    error: function (file, response) { 
    file.previewElement.classList.add("dz-error"); 
    } 
}); 
Dropzone.autoDiscover = false; 
Dropzone.prototype.defaultOptions.dictRemoveFile = "Rimuovi file"; 
Dropzone.prototype.defaultOptions.dictCancelUpload = "Annulla"; 

그리고

는 업로드 처리하는 PHP 스크립트입니다 쿼리 결과가 2MB의 작은 파일 인 경우 PDO과 관련이 있습니다).

문제를 파악하는 데 도움을 주시겠습니까? 내가 스크립트가 실행 30초에 정확히 떨어질 것으로 나타났습니다 몇 가지 테스트를 수행

편집는, 나는

+0

글쎄, 당신의 경우 중 일부는 휴식을 놓치고 있습니다. 이렇게하면 코드가 수정되지는 않지만 코드를 추가해야합니다. –

+0

* "PDOquery와 관련이 없다고 생각합니다"* - 파일 이름이 문자열 일 가능성이 높은 'VALUES (NULL,'0 ','0 ','0 ', $ fileName) 실패 할지라도 나는 잘못 될 수 있습니다. –

+0

게시물을 편집하여이 게시물에 대한 html이 포함되도록 할 수 있습니까? 어쩌면 제한이있는 뭔가가있을 수 있습니다. 로컬 서버에서이 작업을 실행하는 경우 변경 한 후에 변경 한 후에 모든 서비스를 다시 시작했는지 확인하십시오. 최대 실행 시간도 0으로 설정하십시오. –

답변

9

문제는 XHR 타임 아웃에 있던 스크립트의 상단에 set_time_limit(0);을 추가 tryed하지만 아무것도 다시 변경되지했습니다 ajax 호출 구성을 참조했습니다.

이 문제를 방지하려면 초기화 매개 변수에 timeout: 180000 (또는 원하는 것을 ms로 입력해야 함)을 입력해야합니다. DropZone.js로 파일을 업로드 할 때

$("#dZUpload").dropzone({ 
    url: "/ajax/admin/admin.acceptVideo.php", 
    maxFilesize: 209715200, 
    acceptedFiles: "video/*", 
    addRemoveLinks: true, 
    dataType: "HTML", 
    timeout: 180000, 
    success: function (file, response, data) { 
     // Do things on Success 
    }, 
    error: function (file, response) { 
    file.previewElement.classList.add("dz-error"); 
    } 
}); 

이것은 30 seconds 시간 초과가 발생하지 않습니다. @Brendon 뮤어가 보도 된 바와 같이

UPDATE

, 당신은 또한 시간 제한을 해제 timeout0를 삽입 할 수 있습니다.

DropZone.js 문서는 기본 시간 제한이 0이라고보고합니다. 기본값은 30 초입니다. 값 0은 시간 초과를 비활성화합니다.

+0

웹 서버 수준에서 시간 제한 동작에 영향을 줄 수있는 설정도 있습니다. 이 하나는 나를 도왔습니다 : https://stackoverflow.com/questions/24127601/uwsgi-request-timeout-in-python –

+0

또한 시간 제한을 해제하려면 0으로 설정하면됩니다. 문서에서 기본적으로 0으로 잘못보고되지만 실제로 기본적으로 30 초로 설정됩니다. –

+0

제안에 감사드립니다. @BrendonMuir, 답장을 업데이트했습니다. – andreaem