CSV上传无效

时间:2014-04-18 21:16:25

标签: javascript php

我有一个允许用户上传CSV的网络应用。我已经在最新版本的Chrome(以及其他浏览器)上测试过,它运行正常。但是,对于使用完全相同版本的Chrome并上传完全相同的CSV的同事来说,它不起作用。唯一明显的区别是他在Windows上,我在OS X上,所以我想知道这是否能解释其中的区别。我无法访问他的浏览器,所以我无法看到他回复的回复。

这是网站:dailyspiro.com/WF.php

HTML摘录:

<script type="text/javascript">
        function stopUpload(success){
              console.log(success);
              var csv1 = success['csv1'];
              var csv2 = success['csv2'];
              var csv3 = success['csv3'];
              var csv4 = success['csv4'];
              var csvError = success['error'];
              var id = success['id'];
              $('.js-wf-error').text(csvError);
              if (!csvError) {
                runWF(id, csv1, csv2, csv3, csv4);
              }
        }
</script>

<iframe id="upload_target" name="upload_target" src="#" style="width:0;height:0;border:0px solid

<form id="wf-form" class="js-wf-form" method="post" action="wf/csv-upload.php" enctype="multipart/form-data" target="upload_target">
    <input type="file" name="csv1" value="" class="text ui-widget-content ui-corner-all csv-upload" />
    <input type="file" name="csv2" value="" class="text ui-widget-content ui-corner-all csv-upload" />
    <input type="file" name="csv3" value="" class="text ui-widget-content ui-corner-all csv-upload" />
    <input type="file" name="csv4" value="" class="text ui-widget-content ui-corner-all csv-upload" />
  <a  href="#" onclick="$('.js-progress-bar').show(); $(this).closest('form').submit(); return false;" type="submit"class="button redButton largeButton run-wf-button">Run Walking Farm</a>
</form>

完整的PHP上传文件:

<?php

function generateID() {
    return substr(md5(uniqid(mt_rand(), true)), 0, 6);
}

function uploadFile($csv, $id, $i) {
    //$err = $_FILES[$csv]["error"];
    //echo $err;
    if($_FILES[$csv]["type"] != 'text/csv') {
        $error = 'file number ' . $i . ' is not a valid file type.';
        $path = '';
    }
    else {
        $error = '';
      $path = 'files/csv/' . $id . $i . '.csv';
        move_uploaded_file($_FILES[$csv]['tmp_name'], $path);
    }
    $output = array($path, $error);
    return $output;
}

$id = generateID();
$returnData = array();
$returnData['id'] = $id;
$returnData['error'] = '';


$i = 1;
while ($i <= 4) {
    $csv = 'csv' . $i;
    if(!file_exists($_FILES['csv' . $i]['tmp_name'])) {
        $returnData[$csv] = '';
    }
    else {
        $status = uploadFile($csv, $id, $i);
        if ($status[1] != '') {
            $returnData['error'] = $status[1];
        }
        else {
            $returnData[$csv] = $status[0];
        }
    }
    $i++;
}

print_r($returnData);

?>
<script language="javascript" type="text/javascript">
    window.top.window.stopUpload(<?php print json_encode($returnData); ?>);
</script>   

1 个答案:

答案 0 :(得分:2)

您不能依赖$_FILES[$csv]["type"]成为text/csv。 csv有很多MIME类型,因此验证csv不是一个好主意。 这些是我上传到目前为止遇到的所有CSV类型的CSV。我把它放在一个数组中。

$types = array(

    'text/csv',
    'text/plain',
    'application/csv',
    'text/comma-separated-values',
    'application/excel',
    'application/vnd.ms-excel',
    'application/vnd.msexcel',
    'text/anytext',
    'application/octet-stream',
    'application/txt');

我是如何检查的:

$info = pathinfo($_FILES['filename']['tmp_name']);

if(in_array(trim($_FILES['filename']['type']), $types) || ($info['extension'] == 'csv')