2016-03-26 4 views
0

Я пытаюсь загрузить документ PDF с помощью AJAX, но он продолжает сбой с неизвестной ошибкой. Что я делаю не так?Загрузить PDF-файл с помощью AJAX

HTML файла:

<form id="document"> 
    <p> 
     Title<br> 
     <input type="text" name="name" size="30"> 
    </p> 
    <p> 
     Please specify a file, or a set of files:<br> 
     <input type="file" name="datafile" size="40"> 
    </p> 
    <div> 
     <input id="submit-button" type="button" value="Send"> 
    </div> 
</form> 

<script src="jquery.js"></script> 
<script> 
    $(document).ready(function(){ 
     $('#submit-button').click(function() { 
      $.ajax({ 
       type: "POST", 
       dataType: "JSON", 
       url: "upload_document.php", 
       data: $("#document").serialize(), 
       success : function(data){ 
        alert(data.message); 
       }, error : function(data) { 
        alert(data.message); 
       } 
      }); 
     }); 
    }); 
</script> 

PHP File (upload_document.php)

<?php 

header("Access-Control-Allow-Origin: *"); 

try { 
    $id = "[RANDOM_GENERATED_GUID]"; 

    $targetDir = "../../../../modules/sites/documents/"; 
    if (!is_dir($targetDir)) { 
     if (!mkdir($targetDir, 0777, true)) { 
      throw new Exception("Unable to upload your document. We were unable to create the required directories"); 
     } 
    } 

    $targetFile = $targetDir . $id . ".pdf"; 
    $fileType = pathinfo($targetFile, PATHINFO_EXTENSION); 

    if (file_exists($targetFile)) { 
     throw new Exception("Unable to upload your document. The file already exists"); 
    } 

    if ($_FILES["datafile"]["size"] > 2000000) { 
     throw new Exception("Unable to upload your document. The file is to large (Maximum of 2MB)"); 
    } 

    if ($fileType != "pdf") { 
     throw new Exception("Unable to upload your document. Only PDF documents can be uploaded"); 
    } 

    if (!move_uploaded_file($_FILES["datafile"]["tmp_name"], $targetFile)) { 
     //Keeps failing here with error code 0 
     throw new Exception("Unable to upload your document. There was an error uploading the file"); 
    } 

    echo json_encode(array(
     "error" => false, 
     "message" => "Your document was successfully uploaded" 
    )); 
} catch (Exception $ex) { 
    echo json_encode(array(
     "error" => true, 
     "message" => $ex->getMessage() 
    )); 
} 

Я также проверил на сервере, и каталог создается успешно. Спасибо за помощь!

Редактировать
Это точно такой же PHP скрипт работает, если я установить действие на форме, а также использовать кнопку отправки. Единственная причина, по которой я хочу использовать AJAX, - отобразить модальное диалоговое окно после получения ответа

+0

Одна проблема, которую я вижу, что вы получаете $ FILETYPE от имени, которое вы создали и не из файла, который вы загружаете, он должен выглядеть следующим образом: $ fileType = pathinfo ($ _ FILES ["datafile"] ["tmp_name"], PATHINFO_EXTENSION); ' – kunicmarko20

+0

Спасибо, я попробую. Но я также забыл упомянуть, что это отлично работает, если я использую форму, задаю действие и использую кнопку отправки. –

+0

Вы не можете сериализовать файл таким образом. Безопасность браузера/песочница не позволит этого. Вы должны использовать другое решение, возможно, что-то, использующее iframe. См. Это [ссылка] (http://stackoverflow.com/a/4545089/1233305) – David784

ответ

0

Когда вы начинаете использовать AJAX POST, опубликованный параметр следует искать в $ _POST вместо $ _FILES.

Это потому, что $ _FILES - это кэш для файлов, загружаемых через многостраничный пост. Так как вы сериализовать его и послал с помощью AJAX, PHP разбирает JSON и поместить все в $ _POST

Посмотрите here для примера

+0

Спасибо за ответ. Я попытался заменить $ _FILES на $ _POST, но я все равно получаю ту же ошибку. –

+0

@HenryJooste. Можете ли вы попробовать деактивировать свой PHP-код, чтобы увидеть, какая именно строка вызвала проблему? –

+0

Да, я уже это сделал. Он не работает при вызове 'move_uploaded_file'. Поэтому я уверен, что он получает файл, потому что он передает проверку расширения PDF-файла –

Смежные вопросы