我有一个允许用户上传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>
答案 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')