2016-03-26 11 views
0

AJAXを使用してPDF文書をアップロードしようとしていますが、未知のエラーで失敗し続けます。私は間違って何をしていますか?AJAXを使用してPDFをアップロード

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ファイル(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 = pathinfo($ _FILES ["datafile"] ["tmp_name"]、PATHINFO_EXTENSION); – kunicmarko20

+0

ありがとう、私はそれを試してみます。しかし、フォームを使用し、アクションを設定してサブミットボタンを使用すると、これが完璧に動作することは忘れてしまいました。 –

+0

このようにファイルをシリアル化することはできません。ブラウザのセキュリティ/サンドボックスでは許可されません。おそらくiframeを使用して、他のソリューションを使用する必要があります。これを参照してください[リンク](http://stackoverflow.com/a/4545089/1233305) – David784

答えて

0

AJAX POSTを使用すると、投稿されたパラメータは$ _POSTではなく$ _POSTで検索されます。

これは、$ _FILESがmultipart投稿を通じてアップロードされたファイルのキャッシュであるためです。あなたはそれをシリアライズし、AJAXを使用して送信しておりますので、PHPは、JSONを解析し、$ _POST

例えばルックhere私はあなたが生成された名前から$のfileTypeを取得していないことがわかり

+0

応答ありがとう。私は$ _POSTで$ _FILESを置き換えようとしましたが、まだ同じエラーが発生しています –

+0

@HenryJooste問題を引き起こした行を正確に見るためにPHPコードを二等分することはできますか? –

+0

はい、私はすでにそれを行っています。 'move_uploaded_file'呼び出しで失敗します。だから私はそれがPDFファイルの拡張子のチェックを渡すので、ファイルを取得すると確信しています –