PHP文件上传,下载,Sql工具类!
PHP文件上传,下载,Sql工具类! 对文件大小,文件类型 同名覆盖 中文转码的操作,可直接使用
前台 upload.html
<!DOCTYPE html>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<form enctype="multipart/form-data" action="uploadProcess.php" method="post">
<table>
<tr><td align="center" colspan="2"><font style="font-size: 40px; font-family: 华文彩云;" >文件上传</font></td></tr>
<tr>
<td>请填写用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>介绍:</td>
<td><textarea name="intro" rows="10" cols="80"></textarea></td>
</tr>
<tr>
<td>请选择你要上传的文件</td>
<td><input type="file" name="myfile"></td>
</tr>
<tr><td><input type="submit" value="上传文件" /></td></tr>
</table>
</form>
</body>
</html>
控制器 FileProcess.php
<?php
require_once 'FileService.php';
$fileService = new FileService(); if (!empty($_REQUEST['flag'])) {
$flag = $_REQUEST['flag'];
//上传
if ($flag == "upload") {
$username = $_POST['username'];
$intro = $_POST['intro']; $fileService -> Upload($username,$intro);
}elseif ($flag == "down") {
//接收要下载的文件名字
$filepath = $_GET['filepath'];
$filename = $_GET['filename']; $fileService = new FileService();
$fileService->Download($filepath,$filename); }
} ?>
后台 FileService.php
<?php
header("content_type:text/html;charset=utf-8");
require_once 'SqlHelper.php';
error_reporting(E_ALL & ~E_NOTICE); class FileService{ //查询所有文件信息
function fileInfo(){ $sql = "select * from upload";
$sqlHelper = new SqlHelper(); $res = $sqlHelper->execute_dpl($sql);
return $res; $res->free();
} /*
*上传文件
* 功能
* 限制文件大小/类型
* 防止不同用户上传同名图片被覆盖的问题
* 防止同一用户上传的文件名相同的问题
* 参数
* $username
* $intro
*
*is_uploaded_file 上传到tmp缓存
*move_uploaded_file 移动到目标文件
*/
function Upload($username,$intro){ /*********对文件类型进行限制**********/ //获取文件的大小,限制上传文件的大小10M
$file_size = $_FILES['myfile']['size'];
if ($file_size>10*1024*1024) {
echo "<script>alert('上传失败,上传的文件不能超过10M的文件');history.go(-1);</script>";
//echo "上传失败,上传的文件不能超过10M的文件!";
exit();
} //限制上传文件类型
/*
$file_type = $_FILES['myfile']['type'];
if ($file_type!='image/jpg' && $file_type!='image/pjpeg') {
echo "上传失败,文件类型只能是jpg格式!";
exit();
}*/ //判断文件是否上传成功
if (is_uploaded_file($_FILES['myfile']['tmp_name'])) { /***防止不同用户上传同名图片被覆盖的问题->给每个用户创建一个文件夹*****/
//一般创建文件夹的时候根据id创建(username换成id,入参时带入id),防止汉字乱码
//给每个用户动态创建一个相应的文件夹
$user_path = $_SERVER['DOCUMENT_ROOT']."Demo/File/UpDown/upload/".$username;
//判断该用户是否已经有文件夹
if (!file_exists($user_path)) {
mkdir($user_path);
} /****防止同一用户上传的文件名相同的问题->给每个文件名加上时间戳********/
//tmp里的文件名
$file_name = $_FILES['myfile']['name'];
//把缓存文件转存到你希望的目录
$uploaded_file = $_FILES['myfile']['tmp_name'];
//目标路径=(目标目录+用户名)+当前时间+后缀(strpos()字符串首次出现的位置)
$move_to_file = $user_path."/".time().rand(1,1000).substr($file_name, strpos($file_name, ".")); //对中文路径转码
$move_to_file = iconv("utf-8", "gb2312", $move_to_file); /******************数据库操作***********************/
//存入数据库
$uptime = date('Y-m-d H:i:s'); //获取当前上传时间 $sql = "insert into upload (username,fname,fsize,uptime,fpath,intro) values ('$username','$file_name','$file_size','$uptime','$move_to_file','$intro')"; $sqlHelper = new SqlHelper();
$res = $sqlHelper->execute_dml($sql); //判断是否将上传的文件移动到目标位置(先判断是否上传成功,再判断是否添加到数据库)
if (move_uploaded_file($uploaded_file, $move_to_file)) { //res=1表示添加上传成功
if ($res == 1) { echo "<script>alert('{$_FILES['myfile']['name']}文件上传成功');window.location.href='down.php';</script>";
}else{
echo "<script>alert('文件上传失败');history.go(-1);</script>";
} }else{
echo "<script>alert('文件上传失败');history.go(-1);</script>";
} }else{
echo "<script>alert('文件上传失败');history.go(-1);</script>";
}
} /**
*
* 参数说明:
* 下载文件
* $filepath 文件路径
* $filename 文件名
*
*/
function Download($filepath,$filename){
//对中文文件名进行转码
$filename=iconv("UTF-8","GB2312",$filename); if(!file_exists($filepath)){ //检查文件是否存在
echo "<script>alert('该文件不存在!');history.go(-1);</script>";
// echo "该文件不存在!"; return;
} $fp = fopen($filepath, 'r'); //打开文件
$file_size = filesize($filepath); //计算文件大小 if ($file_size>10*1024*1024) { echo "<script>window.alert('文件过大,您没权限下载')</script>";
return;
}
//HTTP头部信息
header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Accept-Length: ".$file_size);
header("Content-Disposition: attachment; filename=".$filename); $buffer = 1024;
//为了下载安全,做一个文件字节读取计数器
$file_count = 0;
//判断文件是否结束 feof
while (!feof($fp) && ($file_size-$file_count > 0)) { $file_data = fread($fp, $buffer); //统计读了多少字节
$file_count+=$buffer; echo "$file_data"; //把数据会送给浏览器
}
fclose($fp);
} } ?>
工具类 SqlHelper.php
<?php /**
* sql工具类(dml,dpl,dpl_arr,close_link)
*
*1.创建MySqli对象
*2.操作数据库(发送sql)
*3.处理结果
*4.关闭资源
*
*/ class SqlHelper {
private $link;
private static $host = 'localhost';
private static $user = 'root';
private static $pwd = '';
private static $db = 'test'; public function __construct() { //初始化
$this->link = new MYSQLi(self::$host,self::$user,self::$pwd,self::$db);
if ($this->link->connect_error){
die("数据库连接失败".$this->link->connect_error);
}
$this->link->query("set names utf8");
} /**
* dpl操作
* @param unknown $sql
*/
public function execute_dpl($sql){
$res = $this->link->query($sql) or die("操作dpl失败".$this->link->error);
return $res;
} /**
* dpl操作
* @param $sql
* @return arr
* 把结果放在数组里。这样资源可以随时关闭,返回一个数组
*/ public function execute_dpl_arr($sql){
$arr = array();
$res = $this->link->query($sql) or die("操作dpl_arr失败".$this->link->error);
//把$res=>$arr,把结果集内容转移到一个数组中
while ($row = $res->fetch_assoc()){
$arr[] = $row;
}
//这里可以把资源立即关闭
$res->free();
return $arr;
} /**
* dml操作 update/delete/insert
* @param unknown $sql
*/
public function execute_dml($sql){ $res = $this->link->query($sql) or die("操作dml失败".$this->link->error);
if (!$res){
return 0; //失败
}else {
if ($this->link->affected_rows>0){
return 1; //成功
}else {
return 2; //没有行受到影响
}
}
$res->free();
} //关闭链接
public function close_link(){
if (!empty($this->link)){
$this->link->close();
}
} }
PHP文件上传,下载,Sql工具类!的更多相关文章
- SpringMVC文件上传下载
在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/q ...
- commons-fileupload实现文件上传下载
commons-fileupload是Apache提供的一个实现文件上传下载的简单,有效途径,需要commons-io包的支持,本文是一个简单的示例 上传页面,注意设置响应头 <body> ...
- JavaWeb 文件上传下载
1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...
- 转载:JavaWeb 文件上传下载
转自:https://www.cnblogs.com/aaron911/p/7797877.html 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端 ...
- Selenium2学习-039-WebUI自动化实战实例-文件上传下载
通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...
- JavaWeb实现文件上传下载功能实例解析
转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...
- Hadoop之HDFS原理及文件上传下载源码分析(下)
上篇Hadoop之HDFS原理及文件上传下载源码分析(上)楼主主要介绍了hdfs原理及FileSystem的初始化源码解析, Client如何与NameNode建立RPC通信.本篇将继续介绍hdfs文 ...
- CentOS下安装配置NFS并通过Java进行文件上传下载
1:安装NFS (1)安装 yum install nfs-utils rpcbind (2)启动rpcbind服务 systemctl restart rpcbind.service 查看服务状态 ...
- C# Http文件上传下载
C# Http文件下载公共类(支持断点续传) http://www.cnblogs.com/hayden/archive/2012/04/26/2472815.html C# Http方式下载文件到本 ...
- SpringMVC整合fastdfs-client-java实现web文件上传下载
原文:http://blog.csdn.net/wlwlwlwl015/article/details/52682153 本篇blog主要记录一下SpringMVC整合FastDFS的Java客户端实 ...
随机推荐
- C#6.0语言规范(九) 命名空间
C#程序使用命名空间进行组织.命名空间既可以用作程序的“内部”组织系统,也可以用作“外部”组织系统 - 一种呈现暴露给其他程序的程序元素的方式. 提供了使用指令(使用指令)以便于使用命名空间. 编译单 ...
- sublime text3: markdown 安装及常用语法简介
自己上传到 github 上的 README.rdm 文件内容显示没有“美化”,所有内容都挤在一块儿了,很不舒服. 原因是:github 的文档 README.rdm 文件使用 markdown 编辑 ...
- 【转】iOS中属性与成员变量的区别
[转载自并整理 http://blog.csdn.net/itianyi/article/details/8618128] 一.类Class中的属性property 在ios第一版中,我们为输出口同时 ...
- 【xsy1281】 珠串 打表+乱搞or数位dp
题目大意:你要找出一个有$k$个的本质不同的$n$位二进制数的集合,使得集合中最大的数最小,请输出这个数 本质不同定义:对于一个数$k$,$rev(k)$,$~k$,$rev(~k)$与$k$本质相同 ...
- Docker三剑客之Docker Machine
一.什么是Docker Machine Docker Machine 是Docker官方编排项目之一,使用go语言编写的,使用不同引擎在多种平台上快速的安装Docker环境,开源地址:https:// ...
- Django模版结构优化和加载静态文件
引入模版 有时候一些代码是在许多模版中都用到的.如果我们每次都重复的去拷贝代码那肯定不符合项目的规范.一般我们可以把这些重复性的代码抽取出来,就类似于Python中的函数一样,以后想要使用这些代码的时 ...
- Numpy.random中shuffle与permutation的区别(转)
huffle与permutation的区别 函数shuffle与permutation都是对原来的数组进行重新洗牌(即随机打乱原来的元素顺序):区别在于shuffle直接在原来的数组上进行操作,改变原 ...
- (转)Python中的上下文管理器和Tornado对其的巧妙应用
原文:https://www.binss.me/blog/the-context-manager-of-python-and-the-applications-in-tornado/ 上下文是什么? ...
- Google Optimization Tools实现员工排班计划Scheduling【Python版】
上一篇介绍了<使用.Net Core与Google Optimization Tools实现员工排班计划Scheduling>,这次将Google官方文档python实现的版本的完整源码献 ...
- Referrer Policy 介绍
发布于 署名 4.0 国际 (CC BY 4.0) 原文链接:https://caixw.io/posts/2017/referrer-policy.html 当用户在浏览器上点击一个链接时,会产生一 ...