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工具类!的更多相关文章

  1. SpringMVC文件上传下载

    在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/q ...

  2. commons-fileupload实现文件上传下载

    commons-fileupload是Apache提供的一个实现文件上传下载的简单,有效途径,需要commons-io包的支持,本文是一个简单的示例 上传页面,注意设置响应头 <body> ...

  3. JavaWeb 文件上传下载

    1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...

  4. 转载:JavaWeb 文件上传下载

    转自:https://www.cnblogs.com/aaron911/p/7797877.html 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端 ...

  5. Selenium2学习-039-WebUI自动化实战实例-文件上传下载

    通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...

  6. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  7. Hadoop之HDFS原理及文件上传下载源码分析(下)

    上篇Hadoop之HDFS原理及文件上传下载源码分析(上)楼主主要介绍了hdfs原理及FileSystem的初始化源码解析, Client如何与NameNode建立RPC通信.本篇将继续介绍hdfs文 ...

  8. CentOS下安装配置NFS并通过Java进行文件上传下载

    1:安装NFS (1)安装 yum install nfs-utils rpcbind (2)启动rpcbind服务 systemctl restart rpcbind.service 查看服务状态 ...

  9. C# Http文件上传下载

    C# Http文件下载公共类(支持断点续传) http://www.cnblogs.com/hayden/archive/2012/04/26/2472815.html C# Http方式下载文件到本 ...

  10. SpringMVC整合fastdfs-client-java实现web文件上传下载

    原文:http://blog.csdn.net/wlwlwlwl015/article/details/52682153 本篇blog主要记录一下SpringMVC整合FastDFS的Java客户端实 ...

随机推荐

  1. Django url分发器

    视图: 视图一般都写在app的views.py中.并且视图的第一个参数永远都是request(一个HttpRequest)对象.这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等.在视 ...

  2. How to resize or create a thumbnail image from file stream on UWP

    最近在搞Ocr相关的windows universal app, 用到了一些图像处理相关的知识. 涉及到了BitmapDecoder/BitmapEncoder/IRandomAccessStream ...

  3. MySQL查询表结构命令

    参考网址:https://www.cnblogs.com/zhangyuhang3/p/6873895.html 一.简单描述表结构,字段类型 desc tabl_name; desc tabl_na ...

  4. Android_EditText 打勾显示输入的密码 --EditText与setTransformationMethod

    实现目标: 实现原理: 为CheckBox添加一个监听器事件; 实现的源码: package edu.cquptzx.showPassword; import android.app.Activity ...

  5. 基于boot2docker部署Docker环境

    Docker轻量级的特性使得我们可以快速打包开发环境:一处编译,到处使用.我们可以在第一次编译好需要的开发环境,然后把镜像导出打包,只有有docker环境,便可以快速还原原来的开发环境. 很常用的一个 ...

  6. 【转载】CentOS中crontab定时计划任务的使用

    转载自:http://blog.csdn.net/testcs_dn/article/details/48780971 概述 利用“任务计划”,可以将任何脚本.程序或文档安排在某个最方便的时间运行.通 ...

  7. Java-Reflection反射-获取包括父类在内的所有字段

    前言 今天Android移动端要加个新功能,所以回归Android程序员的身份.开发的过程中,发现了之前的代码写的有很多问题,真的应该把时间抽出来重构一下了. 其中有反射的一个坑,工具类某方法反射获取 ...

  8. Solidity字符串类型

    字符串可以通过""或者''来表示字符串的值,Solidity中的string字符串不像C语言一样以\0结束,比如abcd这个字符串的长度就为我们所看见的字母的个数,它的长度为4. ...

  9. QT QPushButton

    #include<QApplication> #include<QWidget> #include<QPushButton> #include<QMenu&g ...

  10. java web项目答辩答辩题总结(书本网上语言答辩+自己的语言答辩)

    答辩每个人的总分为1.5分.每个人主要问3个问题. 开发流程===>系统架构====>项目模块+功能===>项目得失重定向与转发:?九个隐式对象?get与post的区辨:?jsp有静 ...