php上传下载文件
之前做一个上传下载的项目,发现网上的和自己需求不是很一样,翻阅了下书籍和整理了下网上的一些代码。做了一个上传下载的demo,上传通过php本身的uploadfile函数,并返回以时间戳命名的文件名后,把文件名插入到数据库;下载则是把文件输出给浏览器,让浏览器来执行下载过程。
不同版本php语法可能不同,另外代码可能会有冗余的地方,如果有错误的地方或者有可以改进的地方,请不吝赐教。
下面附上代码:
upload.php(上传文件代码)注意要建upload(指定上传目录)文件夹
<?php require_once('Connections/connect.php');//数据库连接文件
session_start();//开启session
header("content-type:text/html;charset=gb2312");
header("Content-Type:text/html;charset=utf8");
header("Access-Control-Allow-Origin: *"); //解决跨域
header('Access-Control-Allow-Methods:POST');// 响应类型
mysql_select_db("upload", $testupload); //选择数据库
mysql_query("SET NAMES utf8");//解决中文乱码问题
$extension = end(explode(".", $_FILES["file"]["name"]));// 获取文件后缀名
if ($_FILES["file"]["error"] > 0)
{
echo "错误: " . $_FILES["file"]["error"] . "<br />";
}
/*//限制上传文件类型及大小
elseif (!(($_FILES["file"]["type"]=="image/jpeg" || $_FILES["file"]["type"]=="image/png") && $_FILES["file"]["size"]<1024000)) {
echo "该文件不能被上传!";
}*/
/*//判断文件是否存在
elseif(file_exists($filename))
{
echo "该文件已存在!";
}*/
else
{
$uid = $_SESSION['IDD'];//用户ID
date_default_timezone_set("PRC");//设置时区
$date=date('Ymdhis');//获取时间戳
$titles = $_POST['titles'];//获取输入标题
$author = $_SESSION['userss'];//获取当前登录用户名用以返回上传者信息
$info = $date; //获取前文时间戳赋值给info方便插入info字段
$confname = "$date";//获取前文时间戳
$files='http://localhost/uploadtest/upload/'. $confname .'.'. $extension; //获取上传文件地址:网址+文件名(时间戳+扩展名)
$filesname=$confname .'.'. $extension;//获取文件名(时间戳重命名后的文件名)
//插入数据到数据库
$strsql = "insert into upload (uid,titles,files,filesname,info,author) values('$uid','$titles','$files','$filesname','$info','$author')";
$result = @mysql_query($strsql);
//执行上传操作,设置utf8防止乱码,并指定上传目录为upload
move_uploaded_file($_FILES["file"]["tmp_name"],iconv("UTF-8", "gb2312", "upload/".$confname .'.'. $extension));
header("location:index.php");
}
download.php(下载文件代码)
<?php
$file_name = $_GET['name']; //获取下载文件名
$file_dir = $_GET['dir']; //获取下载文件存放目录
//检查文件是否存在
if (! file_exists ( $file_dir . $file_name )) {
header('HTTP/1.1 404 NOT FOUND');
} else {
//清除表头信息,没有会造成乱码,图片不能显示等问题
ob_clean();
//以只读和二进制模式打开文件
$file = fopen ( $file_dir . $file_name, "rb" ); //告诉浏览器这是一个文件流格式的文件
Header ( "Content-type: application/octet-stream" );
//请求范围的度量单位
Header ( "Accept-Ranges: bytes" );
//Content-Length是指定包含于请求或响应中数据的字节长度
Header ( "Accept-Length: " . filesize ( $file_dir . $file_name ) );
//用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
Header ( "Content-Disposition: attachment; filename=" . $file_name );
//读取文件内容并直接输出到浏览器
echo fread ( $file, filesize ( $file_dir . $file_name ) );
fclose ( $file ); exit ();
}
前台及数据库文件就不码了
有需要完整demo的可以访问github:https://github.com/2-1-1/www/tree/master/testupload
项目目录
根目录文件夹:web
根目录下文件:index.html(登录页面),login.php(登录注销处理页面),index.php(文件列表及下载展示页面),upload.html(上传页面),upload.php(上传处理页面),download.php(下载处理页面)。
次级目录文件夹:Connections
次级目录下文件:connect.php
次级目录文件夹:upload
php上传下载文件的更多相关文章
- rz和sz上传下载文件工具lrzsz
######################### rz和sz上传下载文件工具lrzsz ####################################################### ...
- linux上很方便的上传下载文件工具rz和sz
linux上很方便的上传下载文件工具rz和sz(本文适合linux入门的朋友) ##########################################################&l ...
- shell通过ftp实现上传/下载文件
直接代码,shell文件名为testFtptool.sh: #!/bin/bash ########################################################## ...
- SFTP远程连接服务器上传下载文件-qt4.8.0-vs2010编译器-项目实例
本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,Qt4.8.0版本,vs2010编译器 qt4.8.0-vs2010编译器项目实例下载地址:CSD ...
- linux下常用FTP命令 上传下载文件【转】
1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...
- C#实现http协议支持上传下载文件的GET、POST请求
C#实现http协议支持上传下载文件的GET.POST请求using System; using System.Collections.Generic; using System.Text; usin ...
- HttpClient上传下载文件
HttpClient上传下载文件 java HttpClient Maven依赖 <dependency> <groupId>org.apache.httpcomponents ...
- 初级版python登录验证,上传下载文件加MD5文件校验
服务器端程序 import socket import json import struct import hashlib import os def md5_code(usr, pwd): ret ...
- 如何利用京东云的对象存储(OSS)上传下载文件
作者:刘冀 在公有云厂商里都有对象存储,京东云也不例外,而且也兼容S3的标准因此可以利用相关的工具去上传下载文件,本文主要记录一下利用CloudBerry Explorer for Amazon S3 ...
- SFTP上传下载文件、文件夹常用操作
SFTP上传下载文件.文件夹常用操作 1.查看上传下载目录lpwd 2.改变上传和下载的目录(例如D盘):lcd d:/ 3.查看当前路径pwd 4.下载文件(例如我要将服务器上tomcat的日志文 ...
随机推荐
- 针对CCTV摄像头的扫描爆破工具 :Cameradar
针对CCTV摄像头的扫描爆破工具 :Cameradar 0x01功能介绍 简述:Cameradar 是一款基于docker使用的RTSP数据流访问工具.该工具可以通过基于RT ...
- JSP——底层原理
都知道jsp就是在HTML文件中写java代码,以实现动态页面的效果,但是这种动态是如何实现的呢?今天就在研究一下. 首先,我写了一个简单的jsp文件: <%@page import=" ...
- mpvue+小程序云开发,纯前端实现婚礼邀请函(相册小程序)
请勿使用本文章及源码作为商业用途! 前言 当初做这个小程序是为了婚礼前的需要,结婚之后,希望这个小程序能够留存下来,特地花了一些空闲时间将小程序转化成为“相册类小程序” 体验码 准备工作 mpvue框 ...
- Linux跨网段通信小实验
一.实验场景. 实验准备,Linux主机4台.分别是主机A,路由主机R1,路由主机R2,主机 C,主机A的ip是192.168.56.66/24,且只有一块网卡eth0:路由主机R1有两块网卡eth0 ...
- Java面向对象程序设计第15章5
5. 利用URLConnetction对象编写程序返回某网站的首页,并将首页的内容存放到文件当中. import java.net.*; import java.io.*; public class ...
- Class文件结构全面解析(上)
什么是Class文件? 在Java刚刚诞生的时候就提出了一个非常著名的口号:"一次编写,到处运行.(Write Once,Run Anywhere)".为了实现平台无关性,各种不同 ...
- MySql: AUTO_INCREMENT
首先要在Column使用AUTO_INCREMENT (每张表只有一个列可以AUTO_INCREMENT): 以下示例取自MySql官网(http://dev.mysql.com/doc/refman ...
- MyBatis批量更新动态sql
<update id="updateDataKetState"> update ${tablespace}.IDEA_DATAKEY_STATE <trim pr ...
- spark集群搭建(三台虚拟机)——zookeeper集群搭建(3)
!!!该系列使用三台虚拟机搭建一个完整的spark集群,集群环境如下: virtualBox5.2.Ubuntu14.04.securecrt7.3.6_x64英文版(连接虚拟机) jdk1.7.0. ...
- mysql 创建用户及授权(2)
一. MySQL初始密码 新安装的MySQL默认是没有密码的,设置初始密码可以用以下命 mysqladmin -u root password 'new-password' mysqladmin -u ...