对于thinkPHP来说,我们上传文件时最好写一个模态窗口,这样使用起来也很方便。
先写一个按钮
<button class="btn btn-primary" data-toggle="modal" data-target="#myimport">
<span class="glyphicon glyphicon-pencil"></span> 导入</button>
模态窗口
<form method="post" action="__URL__/upload" class="form-horizontal" role="form" id="myForm" οnsubmit="return " enctype="multipart/form-data">
<div class="modal fade" id="myimport" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<!-- 定义模态框,过渡效果为淡入,id为myModal,tabindex=-1可以禁用使用tab切换,aria-labelledby用于引用模态框的标题,aria-hidden=true保持模态框在触发前窗口不可见 -->
<div class="modal-dialog">
<!-- 显示模态框对话框模型(若不写下一个div则没有颜色) -->
<div class="modal-content">
<!-- 显示模态框白色背景,所有内容都写在这个div里面 -->
<div class="btn-info modal-header">
<!-- 模态框标题 -->
<button type="button" class="close" data-dismiss="modal">×</button>
<!-- 关闭按钮 -->
<h4>您好,请上传文件</h4>
<!-- 标题内容 -->
</div>
<div class="modal-body">
<!-- 模态框内容,我在此处添加一个表单 -->
<form class="form-horizontal" role="form">
<div class="form-group">
<input type="file" name="photo" />
</div>
</form>
</div>
<div class="modal-footer">
<!-- 模态框底部样式,一般是提交或者确定按钮 -->
<button type="submit" class="btn btn-info">确定</button>
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
</div>
</div><!-- /.modal-content -->
</div>
</div> <!-- /.modal -->
</form>
对于后台php,代码如下:
public function upload(){
$upload = new \Think\Upload();//实例化上传类
$upload->maxSize = 0;//设置附件上传大小
$upload->exts = array('csv');//设置附件上传类型
$upload->rootPath = './Public/Upload/';//设置附件上传根目录
$upload->savePath = '';//设置附件上传(子)目录
//上传文件
$info = $upload->upload();
if(!$info) {// 上传错误提示错误信息
$this->error($upload->getError());
}else{// 上传成功 获取上传文件信息
foreach($info as $file){
$this->success('上传成功!' . $file['savepath'].$file['savename'],'import',3);
// echo $file['savepath'].$file['savename'];
}
}
}
public function import(){
$file = "./Public/Upload/2018-03-26/5ab86d50632ea.csv";
$encoding = detect_encoding($file);
// dump($encoding);
// exit;
if ($encoding != 'UTF-8') {
$contens = file_get_contents($file);
$contens = mb_convert_encoding($contens, 'utf-8', $encoding);
file_put_contents($file, $contens);
}
$fp = fopen($file, 'r');
if($fp){
$fields = array('no','name','sex');
// dump($fields);
$model = M('student');
$arrno = $model->getfield('no',true);
// dump($arrno);
$arr = array();
while (($row=fgetcsv($fp,1000,','))!==false) {
$row = array_combine($fields, $row);
$row['py']= SpGetPinyin($row['name'],'UTF8');
if (in_array($row['no'], $arrno)) {
$file = "./Public/Upload/demo.txt";
$ret .= $row['no'] . '重复' . '<br>';
file_put_contents($file,$ret);
}else{
$arrno[] = $arr['no'];
$arr[] = $row;
$file = "./Public/Upload/demo.txt";
$ret1 .= $row['no'] . '成功' . '<br>';
file_put_contents($file,$ret1);
}
if (count($arr) == 1000) {
$model->addAll($arr);
unset($arr);
}
}
if (count($arr)>0) {
$model->addAll($arr);
}
$this->show('数据库添加成功','utf8');
$this->success("",'index');
}
}
如果只写以上代码,信息会直接写在网页中,为了避免这种情况,我们上传时通过先下载一个demo文件,所有信息都在demo文件中显示:
$file_name = "demo.txt"; //下载文件名
$file_dir = "./Public/Upload/"; //下载文件存放目录
//检查文件是否存在
if (! file_exists ( $file_dir . $file_name )) {
echo "文件找不到";
exit ();
} else {
//打开文件
$file = fopen ( $file_dir . $file_name, "r" );
//输入文件标签
Header ( "Content-type: application/octet-stream" );
Header ( "Accept-Ranges: bytes" );
Header ( "Accept-Length: " . filesize ( $file_dir . $file_name ) );
Header ( "Content-Disposition: attachment; filename=" . $file_name );
//输出文件内容
//读取文件内容并直接输出到浏览器
echo fread ( $file, filesize ( $file_dir . $file_name ) );
fclose ( $file );