之前做一个上传下载的项目,发现网上的和自己需求不是很一样,翻阅了下书籍和整理了下网上的一些代码。做了一个上传下载的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上传下载文件的更多相关文章

  1. rz和sz上传下载文件工具lrzsz

    ######################### rz和sz上传下载文件工具lrzsz ####################################################### ...

  2. linux上很方便的上传下载文件工具rz和sz

    linux上很方便的上传下载文件工具rz和sz(本文适合linux入门的朋友) ##########################################################&l ...

  3. shell通过ftp实现上传/下载文件

    直接代码,shell文件名为testFtptool.sh: #!/bin/bash ########################################################## ...

  4. SFTP远程连接服务器上传下载文件-qt4.8.0-vs2010编译器-项目实例

    本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,Qt4.8.0版本,vs2010编译器 qt4.8.0-vs2010编译器项目实例下载地址:CSD ...

  5. linux下常用FTP命令 上传下载文件【转】

    1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...

  6. C#实现http协议支持上传下载文件的GET、POST请求

    C#实现http协议支持上传下载文件的GET.POST请求using System; using System.Collections.Generic; using System.Text; usin ...

  7. HttpClient上传下载文件

    HttpClient上传下载文件 java HttpClient Maven依赖 <dependency> <groupId>org.apache.httpcomponents ...

  8. 初级版python登录验证,上传下载文件加MD5文件校验

    服务器端程序 import socket import json import struct import hashlib import os def md5_code(usr, pwd): ret ...

  9. 如何利用京东云的对象存储(OSS)上传下载文件

    作者:刘冀 在公有云厂商里都有对象存储,京东云也不例外,而且也兼容S3的标准因此可以利用相关的工具去上传下载文件,本文主要记录一下利用CloudBerry Explorer for Amazon S3 ...

  10. SFTP上传下载文件、文件夹常用操作

    SFTP上传下载文件.文件夹常用操作 1.查看上传下载目录lpwd 2.改变上传和下载的目录(例如D盘):lcd  d:/ 3.查看当前路径pwd 4.下载文件(例如我要将服务器上tomcat的日志文 ...

随机推荐

  1. 零基础Linux入门之《Linux就该这么学》

    本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材,目前是国内最值得去读的Linux教材,也是最有价值 ...

  2. Pycharm创建项目时 自动添加头部信息

    1.打开PyCharm,选择File--Settings 2.依次选择Editor---Code Style-- File and Code Templates---Python Script 3.. ...

  3. mvn上传dubbo jar到nexus

    第一种方式: mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=dubbo -Dversion=2.8.4 -Dpackaging=j ...

  4. 花一天时间试玩vsphere6.7(EXSI)服务器版的vmware

    花一天时间试玩vsphere6.7(EXSI)服务器版的vmware 要注册账号(2019年11月14注册): 登陆网址:https://my.vmware.com/cn/group/vmware/h ...

  5. 深入理解计算机系统 第十章 系统级I/O

    很多高级语言都提供了执行 I/O 的较高级别的函数.为什么我们还要学习 Unix I/O? 原因:1.由于 I/O 和其他系统概念之间有循环依赖关系,故了解 Unix I/O 将帮助我们理解其他的系统 ...

  6. jquery 判断数组是否为空

    jquery 判断数组是否为空 if (data.length === 0) { console.log("数组为空"); }

  7. lqb 基础练习 特殊的数字

    基础练习 特殊的数字 时间限制:1.0s   内存限制:512.0MB     问题描述 153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3.编程求所有 ...

  8. nyoj 41-三个数从小到大排序(STL --> sort(a, a+n) 升序)

    41-三个数从小到大排序 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:31 submit:44 题目描述: 现在要写一个程序,实现给三个数排序的功 ...

  9. 插入订单并且输出订单号的sql存储过程

    --插入订单-- create proc InsertOrders ( @OrderNumber varchar(300), @OrderState varchar(30), @OrderType v ...

  10. django_4数据库3——admin

    生成admin界面 1.setting.py中,保证'django.contrib.admin',应用打开,django1.11默认打开的 2.url.py中的admin默认时打开的 3.对model ...