可以选择form表单提交或者Ajax提交,form表单简单点,所以我选择Ajax。
一、前端
html
<tr>
<td><input type="file" name="file" id="file"/></td>
</tr>
<tr>
<td><input type="submit" name="submit" id="csv" value="导入" class="btn btn-brand" style="width: 100px;"/></td>
</tr>
js
function csv_file() {
//判断是否上传文件
if($('#file')[0].files.length == 0){
$("#result").modal();
$$.getElementById('msg').innerHTML = '请选择上传文件。';
return;
}
var csv_file = $('#file')[0].files[0];
var formData = new FormData();
formData.append("file",csv_file);
$.ajax({
url: '/admin/node/csv',
data: formData,
cache: false,
// contentType: 'multipart/form-data',
contentType: false,// 不要设置Content-Type请求头
processData: false,// 使数据不做处理
type: 'POST',
success: function(data){
data = JSON.parse(data);
console.log(data);
$("#result").modal();
$$.getElementById('msg').innerHTML = data.msg;
},
error: function(data){
$("#result").modal();
$$.getElementById('msg').innerHTML = '服务器发生错误了。';
}
});
}
$$.getElementById('csv').addEventListener('click', csv_file);
二、后端
public function cvs($request, $response, $args)
{
// $request->getUploadedFiles() 等同于 $_FILES
// header("Access-Control-Allow-Origin: *"); //防止跨域报错
$files = $request->getUploadedFiles();
if (empty($files['file'])) {
$rs['ret'] = 0;
$rs['msg'] = '请选择上传文件!';
return $response->getBody()->write(json_encode($rs));
}
$newfile = $files['file'];
// do something with $newfile
//将上传的缓存文件备份到storage/upload目录下
$move_path = STORAGE_PATH.'upload/';
if ($newfile->getError() === UPLOAD_ERR_OK) {
$uploadFileName = $newfile->getClientFilename();
$newfile->moveTo($move_path.$uploadFileName);
} else {
$rs['ret'] = 0;
$rs['msg'] = '缓存文件移动失败!';
return $response->getBody()->write(json_encode($rs));
}
// setlocale(LC_ALL, 'zh_CN'); //设置简体中文
$filepath = $move_path.$uploadFileName;
if (($handle = fopen($filepath, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 10000, ",")) !== FALSE) {
$node = '';
if (count($data) == 10){
$node = new Node();
$node->name = isset($data[0]) && !empty($data[0]) ? trim($data[0]) : time();
$node->server = isset($data[1]) ? trim($data[1]) : '';
$node->save();
}else{
$rs['ret'] = 0;
$rs['msg'] = '请检查配置文件是否正确,不需要填写的请留空!';
return $response->getBody()->write(json_encode($rs));
}
}
fclose($handle);
} else {
$rs['ret'] = 0;
$rs['msg'] = '文件打开失败,请查看文件执行权限!';
return $response->getBody()->write(json_encode($rs));
}
// $csvAsArray = array_map('str_getcsv', file($filepath));//数组形式
$rs['ret'] = 1;
$rs['msg'] = '上传成功';
return $response->getBody()->write(json_encode($rs));
}
配置文件后缀为 txt 或者 cvs 都可以,但是要使用UTF-8的编码方式,格式如下:
test,无描述,0 //第一种
or
"test","无描述",0 //第二种
逗号为半角的,引号为双引号。
经测试,如果是第一种写法,选择UTF-8编码方式,不管有没有BOM头都没关系;如果是第二种写法,就需要选择无BOM的UTF-8编码方式,不然头部会有多余不可见字符。所以,推荐第一种。