【发布时间】:2015-07-08 14:57:31
【问题描述】:
我有一个用于 wordpress 的 csv 上传插件。我可以在mac上上传文件,但在windows pc上上传失败。 csv文件是在电脑上用utf-8编码创建的。
if (isset($_POST) && !empty($_POST)) {
if (isset($_FILES) && $_FILES['csv_file']['size'] > 0 && $_FILES['csv_file']['type'] === 'text/csv') {
global $wpdb;
ini_set("auto_detect_line_endings", true);
$start_row = (int) $_POST['start_row'];
/*
* Get CSV data and put it into an array
*/
$fileData = file_get_contents($_FILES['csv_file']['tmp_name']);
$lines = explode(PHP_EOL, $fileData);
$csv = array();
foreach ($lines as $line) {
$csv[] = str_getcsv($line);
}
/*
* Put each row into the database
*/
$x = 1;
$insert_count = 0;
$insert_output = array();
$wpdb->query('TRUNCATE TABLE table');
foreach ($csv as $data) {
if ($x >= $start_row) {
$date = fix_date($data[0]);
$sql = "
INSERT INTO table ( date, column_1, column_2, column_3, column_4, column_5, column_6, column_7 )
VALUES ( '" . $date . "', '" . addslashes( $data[1] ) . "', '" . utf8_encode( $data[2] ) . "', '" . addslashes( $data[3]) . "', '" . $data[4] . "', '" . addslashes( $data[5] ) . "', '" . $data[6] . "', '" . $data[7] . "' )
";
$wpdb->query($sql)/* or die($sql)*/;
$insert_output[] = $insert_count . '. Added: ' . $data[1] . ' - ' . $data[3] . '<br />';
$insert_count++;
}
$x++;
}
echo '<div class="csv_success">Success. ' . number_format($insert_count) . ' rows uploaded.</div>';
} else {
echo '<div class="csv_failure">Please make sure the file you uploaded is a CSV.</div>';
}
}
有什么想法可以让它在 windows 和 mac 上运行吗?
干杯
【问题讨论】:
-
PHP_EOL 是您正在使用的操作系统的换行符常量,但是如果文件是在操作系统上创建的并且您在另一个上上传它,它可能无法正常工作。也许尝试 explode("\n",$x) 并修剪线条,因为 \n 应该在两者中。
-
检查非零大小不是验证上传的正确方法。失败的上传很容易具有非零大小。在对上传进行任何其他操作之前,您需要检查
if($_FILES['csv_file']['error'] === UPLOAD_ERR_OK)。PHP_EOL是 LOCAL 系统的 eol 字符。它对处理跨平台的东西没用,因为 Mac eol 不是 PC eol -
只是出于好奇,您是否检查过位于
public_html的error_log文件[有时]? -
顺便说一句,这不是我的代码,我正在尝试调试以前的开发人员代码,看起来像 $_FILES['csv_file']['type'] === 'text/csv' 是问题
-
实际上 $_FILES['csv_file']['type'] === 'text/csv' 有时在 windows 类型的 csv 将是 'application/octet-stream' 所以也要检查一下跨度>