使用ajax和php上传文件

时间:2014-07-16 13:53:12

标签: php jquery ajax file-upload

我有一个完整的php文件脚本。 它是一个带有浏览按钮的dataTable,用于在数据库中添加新视频并在DataTable中重新加载

问题是数据库中的条目已生成,但文件永远不会从其原始位置复制到库/视频文件夹。

我已经尝试并试图让它继续下去似乎php move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)的一部分永远不会被执行。

<?php

include 'config.php';

$sTable = "media";


$rootFolder = '../video/';
$libraryFolder = '../video/library/';
$priorityFolder = '../video/priority/';

if (!is_dir($rootFolder)) {
    mkdir($rootFolder, 0777, true);
}
if (!is_dir($libraryFolder)) {
    mkdir($libraryFolder, 0777, true);
}
if (!is_dir($priorityFolder)) {
    mkdir($priorityFolder, 0777, true);
}



if(isset($_POST['script'])){


    try {
        $db = new PDO(
            "mysql:host=".Config::$DB_HOST.";dbname=".Config::$DB_DATABASE.";charset=utf8",
            Config::$DB_USERNAME,
            Config::$DB_PASSWORD
        );
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        print_r('CONNECTED TO DATABASE');
    } catch(PDOException $e) {
        print_r('ERROR CONNECTING TO DATABASE');
    }


    switch($_POST['script']){

        case 'fetchAll':
            $query = $db->prepare("SELECT * FROM $sTable");
            $query->execute();
            echo json_encode(array('media' => $query->fetch()));
            break;



        case 'insert':
            $target = $_POST['file'];
            $target_path = "../video/library/";
            $target_path = $target_path . $target;


            if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
                echo "The file ".  $target ." has been uploaded";

            } else{
                echo "There was an error uploading the file, please try again!";
            }


            $data = array(
                ':name' => $target,
                ':path' => $target_path);
            $table = 'media';
            $fields = array('name', 'path');
            $parameters = array(':name', ':path');
            $param = implode(',',$parameters);

            $stmt = $db->prepare("INSERT INTO {$table} (name, path) VALUES (:name, :path)");

            try {
                $db->beginTransaction();
                $stmt->execute(array("$parameters[0]" => $data[':name'], "$parameters[1]" => $data[':path']));
                $db->commit();
                print $db->lastInsertId();
            } catch(PDOExecption $e) {
                $db->rollback();
                print "Error!: " . $e->getMessage() . "</br>";
            }


            break;

        default:
            print_r('default');
            break;


    }
}


$db = null;










?>

<script>
    $(document).ready( function () {
        $('#vidlib_dtable').dataTable( {
            "dom": '<"top"f>rt<"bottom"lp><"clear">'
        } );
    } );
</script>




<script>
    $("#uploadedfile").on("change", function(){
        var file = this.files[0];
        var fileName = file.name;
        var fileSize = file.size;
        var fileType = file.type;
    });


    $(document).ready( function () {
        $("#vidUpdSubmit").click(function() {

            oFiles = document.getElementById("uploadedfile").files[0];
            nFiles = oFiles.name;
            nSize = oFiles.size;

            var myFile = $('#uploadedfile').prop("files")['name'];
            var url = "./inc/MediaScripts.php"; // the script where you handle the form input.

            $.ajax({
                type: "POST",
                data: ({'script':'insert',
                    'file': nFiles}
                    ),
                cache: false,
                success:function(data){
                    alert(data);
                },error:function(errormsg){
                    alert('EPPIC FAIL');
                }
            });

            return false; // avoid to execute the actual submit of the form.
        });
    } );
</script>





<div class="site_window_header">File manager</div>
<div>
    <div class="vl_buttonPane">
        <form  id="vidUpdForm" action="" method="POST">
            <input type="hidden" name="sctipt" value="insert" id="sctipt"/>
            Choose a file to upload: <input name="uploadedfile" id="uploadedfile" type="file" /><br />
            <input type="submit" id="vidUpdSubmit" value="Upload File" />
        </form>
    </div>
    <div class="vl_rightPane">

        <table id="vidlib_dtable" class="display">
            <thead>
            <tr>
                <th>Name</th>
                <th>Title</th>
                <th>File path</th>
                <th>Duration</th>
                <th>Date uploaded</th>
                <th>Uploaded by</th>
                <th>Key words</th>
                <th>Comments</th>
            </tr>
            </thead>
        </table>
    </div>
</div>

HERE is a link to a dropbox zip file with a manageable working copy of the program

解决方案:感谢 - &gt; Alexander Ceballos

Upload Multiple Files with PHP and JQuery

1 个答案:

答案 0 :(得分:3)

问题不在于$_FILES,问题在于您没有提交文件。您正在使用ajax发布文件名(nfiles)和值{insert'和data:({'script':'insert', 'file':nfiles}),这允许您的脚本处理表更新。但是,由于表单未提交,因此您实际上并未发布文件,因此$_FILES['uploadedfile]实际上未定义。您需要实际提交表单,然后您才能按照脚本当前编写的方式处理文件移动。或者您需要将文件添加到ajax帖子,这需要您创建表单数据对象var formData = new FormData();。有关uploading files with ajax的更多信息,请查看此页面,或查看this示例。希望这会有所帮助。