使用临时副本上载后,将CSV文件解析为JSON

时间:2017-01-19 08:29:24

标签: php json ajax csv ractivejs

我差不多已经完成了将CSV文件解析为JSON的功能,只需要将它拼凑在一起就需要帮助。它的工作方式是使用AJAX / Jquery上传文件。一旦文件上传并发送,PHP将解析CSV文件到JSON然后执行。

解析后,转换后的文件将作为JSON对象推送或发送到API。这是我一直在工作的代码。对于上传我正在使用此插件AJAX/JQuery File Uploader

此功能也是基于使用RactiveJS

构建的

AJAX / Jquery文件上传器

这是我目前正在上传或放置文件的部分。网址指向upload.php

<div id="fileuploader">Upload</div>

<script>
$(document).ready(function() {
    $("#fileuploader").uploadFile({
        url: 'upload.php',
    });
})
</script>

Uploads.php

有没有办法GET上传文件的临时副本并使用我在下面构建的PHP代码解析将CSV转换为JSON

<?php

    if ( 0 < $_FILES['file']['error'] ) {
        echo 'Error' . $_FILES['file']['error'] . '<br/>';
    }

    else {

        move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);

    }


?>

PHP(CSV到JSON)

现在正在手动声明文件。

<?php
    $json_data = csvToJson('lms.csv');
?>  
<?php 


    function csvToJson($fname) {
        if (!($fp = fopen($fname, 'r') )) {
            die("Can't open file");
        }

        else {
            ('Upload File');
        }

        $key = fgetcsv($fp, "1024", ",");

        $json = array();
            while ($row = fgetcsv($fp, "1024", ",")) {
                $json[] = array_combine($key, $row);
        }

        fclose($fp);

        foreach ( $json as $k=>$v ) {

            $json[$k]['accountName']           =     $json[$k]['ACCOUNT NAME']; 
            $json[$k]['dateRequested']         =     $json[$k]['DATE']; 


            unset($json[$k]['ACCOUNT NAME']);
            unset($json[$k]['DATE']);

        }

        return json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);

    }

 ?>

<?php // $target_file = fopen($_FILES["fileToUpload"]["tmp_name"], 'r'); ?>

发送转换为API(Ractive / AJAX / JS)

正如您所看到的,发送部分是由点击事件(app.on)

触发的
<script src="https://cdnjs.cloudflare.com/ajax/libs/ractive/0.9.0-build-48/ractive.js"></script>



<script type="text/javascript">

var app = new Ractive({
    el       : '#container',
    template : '#template',
});


    var proxy       = 'http://192.168.1.126/lms-dev-noel/proxy.php';
    var endpoint    = 'account/leads/';
    var rt          = 'POST';
    var url         = proxy+'?endpoint='+endpoint+'&rt='+rt;

    var lms_json    = <?php echo json_encode($json_data); ?>;
    var jobjects    = JSON.parse(lms_json);


    for ( i = 0; i < jobjects.length; i++ ) {
        var data = jobjects[i];


        console.log(data);

        $.ajax({
              type     : 'POST',
              url      : url,
              data     : data,
              dataType : 'json',
              success  : function() {

              },
              error    : function(error) {
                  console.log('Error')
              }

        });

    }



</script>

警告和通知 enter image description here

1 个答案:

答案 0 :(得分:1)

嗯,这取决于csvToJson函数在代码中的位置。如果它在uploads.php中,或者在uploads.php中可以include的单独文件中,那么您可以这样做:

move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);

$json_data = csvToJson('uploads/' . $_FILES['file']['name']);
echo $json_data;

然后在脚本中,更改

var lms_json    = <?php echo json_encode($json_data); ?>;

var lms_json;

并将其移至您的javascript顶部。

您似乎在尝试在API调用之前分配变量。相反,您需要从uploadFile调用的响应中捕获数据(根据这些文档:http://hayageek.com/docs/jquery-upload-file.php):

$("#fileuploader").uploadFile({
    url: 'upload.php',
    onSuccess:function(files,data,xhr,pd)
    {
      //data: response from server
      lms_json = data;
    }
});
相关问题