php上传大型文件代码,大文件上传

[php]代码库<?php

function testLog($content)

{

file_put_contents("a.txt", var_export($content, true)."\r\n", FILE_APPEND);

}

/**

* [helper 取值简便方法]

* @param [String] $query [post.arg get.arg server.arg cookie.arg]

* @param [type] $default [默认值]

* @return [type] [description]

*/

function helper($query,$default=null){

$qus = explode('.', $query);

if(count($qus) === 1){

$type = strtolower($_SERVER['REQUEST_METHOD']);

}else{

$type = strtolower($qus[0]);

$query = $qus[1];

}

switch ($type) {

case 'post':

return isset($_POST[$query]) ? $_POST[$query] : $default;

case 'get':

return isset($_GET[$query]) ? $_GET[$query] : $default;

case 'server':

return isset($_SERVER[$query]) ? $_SERVER[$query] : $default;

case 'cookie':

return isset($_COOKIE[$query]) ? $_COOKIE[$query] : $default;

default:

return $default;

}

}

date_default_timezone_set('PRC');

header('Content-type: application/json');

//上传文件

testLog($_FILES);

if ($_SERVER['REQUEST_METHOD'] === 'POST'){

if (!empty($_FILES)){

foreach ($_FILES as $file) {

$uploader = new Uploader();

$info = $uploader->upload($file);

//目前块只包含一个文件

echo json_encode($uploader->getResult());

die;

}

}

}else if($_SERVER['REQUEST_METHOD'] === 'GET'){

//断点上传

//获取文件基本信息

$uploader = new Uploader();

$upload = $uploader->getUploadInfo();

echo json_encode($upload);

}

/**

* 分隔文件处理

*/

class Uploader{

/**

* 临时文件上传保存目录

*/

const UPLOAD_TMP_PATH = './_tmp/';

/**

* 合并后的文件保存目录

*/

const UPLOAD_REAL_PATH = './upload/';

/**

* 文件上传成功状态

*/

const STATUS_SUCCESS = 0;

/**

* 文件上传失败状态

*/

const STATUS_MOVE_ERROR = 1;

/**

* [$error 错误消息]

* @var string

*/

protected $error = '';

/**

* [$code 消息代码]

* @var integer

*/

protected $code = 0;

/**

* [

* __construct 构造方法,主要获取上传的基本信息.和服务端的数据进行对比.

* NOTE:可以结合文件的hash值实现文件秒传功能,原理差不多了

* ]

*/

public function __construct(){

$this->config = array(

'filename' => helper('filename'),

'filesize' => intval(helper('filesize')),

'filetype' => helper('filetype'),

'modified' => intval(helper('modified')),

'trunksize'=> intval(helper('trunksize'))

);

$this->hash = md5(serialize($this->config));

}

/**

* [upload 上传文件]

* @param [type] $file [$_FILES[0]前端上传的FILE]

* @return [type] [description]

*/

public function upload($file){

// print_r($this->config);

$trunk = intval(helper('post.trunk'));

$total = helper('post.total');

// print_r($file);

//文件移动成功,记录文件上传指针

$trunkname = self::UPLOAD_TMP_PATH . $this->hash . '.part.'.$trunk;

if(@move_uploaded_file($file['tmp_name'], $trunkname)){

static::log('success','文件'.$this->config['filename'].',块'.$trunk.'移动成功');

$upload = $this->_uploadSuccess($trunk,$trunkname);

if(count($upload) == $total){

//合并文件

$this->combineTrunkFile();

}

$this->setCode(self::STATUS_SUCCESS,'ok');

return true;

}

static::log('error','文件'.$this->config['filename'].',块'.$trunk.'移动失败');

$this->setCode(self::STATUS_MOVE_ERROR,'移动上传块'.$trunk.'失败');

return false;

}

/**

* [setCode 设置返回消息]

* @param [type] $code [code]

* @param string $msg [消息]

*/

protected function setCode($code,$msg=''){

$this->error = $msg;

$this->code = $code;

}

/**

* [getResult 获取结果]

* @return [type] [result]

*/

public function getResult(){

return [

'code' => $this->code,

'error' => $this->error

];

}

/**

* [_uploadSuccess 记录上传成功的块]

* @param [type] $trunk [块id]

* @return [type] [返回上传所有已经上传的块]

*/

protected function _uploadSuccess($trunk,$trunkname){

$log = self::UPLOAD_TMP_PATH .$this->hash.'.log';

$uploadLog = $this->getUploadInfo();

if(false === array_key_exists($trunk, $uploadLog['record'])

|| $uploadLog['record'][$trunk] < $uploadLog['trunksize']){

$uploadLog['record'][ $trunk ] = filesize($trunkname);

file_put_contents( $log,serialize($uploadLog) );

}

return $uploadLog['record'];

}

/**

* [getUploadInfo 获取服务端保存的文件上传信息]

* @return [type] [description]

*/

public function getUploadInfo(){

$log = self::UPLOAD_TMP_PATH .$this->hash.'.log';

if(file_exists($log)){

$uploadLog = unserialize(file_get_contents($log));

}else{

$uploadLog = $this->config;

$uploadLog['total'] = helper('post.total',0);

$uploadLog['record'] = [];

}

return $uploadLog;

}

/**

* [combineTrunkFile 合并文件]

* @param [type] $config [文件碎片信息]

* @return [type] [description]

*/

public function combineTrunkFile(){

$config = $this->getUploadInfo();

$partname = self::UPLOAD_TMP_PATH . $this->hash . '.part.';

$fp = fopen(self::UPLOAD_REAL_PATH . $config['filename'], 'w');

//注意,切割的文件编号从1开始的

for ($i=1; $i <= $config['total']; $i++) {

fwrite($fp, file_get_contents( $partname.$i ));

//产出文件

unlink($partname.$i);

}

static::log('success','文件'.$config['filename'].'合并成功');

fclose($fp);

}

/**

* [log 记录上传日志]

* @param string $type [description]

* @param string $msg [description]

* @return [type] [description]

*/

public static function log($type='', $msg=''){

$str = sprintf('[%s] %s => %s'.PHP_EOL,date('Y-m-d H:i:s'),strtoupper($type),$msg);

if (($fp = fopen('upload_log.log', 'a+')) !== false) {

fputs($fp, $str);

fclose($fp);

}

}

}

694748ed64b9390909c0d88230893790.png

HttpUploader4全面升级了文件IO组件。新的IO组件在处理磁盘中的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得HttpUploader4在处理TB级数据时能够拥有闪电般的速度。 新的IO组件赋予了HttpUploader4更强的大数据处理能力。现在HttpUploader4在对GB级文件进行MD5校验时速度提高了4倍。同时CPU占用率更低。 HttpUploader4更加注重对硬盘的保护,在HttpUploader4中不再直接对文件进行I/O操作,而是在内存中对文件进行操作,所以不仅极大的减少了对硬盘的读写次数,同时速度却变的更快了。 借助于HttpUploader4企业能够帮助用户更加轻松的处理工作中的文件,让用户与用户之间的沟通更加的高效。从根本上提高企业竞争力。 考虑到不同的企业使用的开发平台不同,我们已经为企业开发人员提供了完整的与数据库相结合的示例(ASP.NET,JSP,PHP)。开发人员能够非常容易的在自已的系统中实现断点续传功能。 产品特点如下: 1. 为TB级文件提供稳定传输功能。 2. 优化MD5组件,文件扫描速度提升70%。 3. 保护磁盘,上传超大文件时,磁盘IO次数降低50%。 4. 采用全新设计IO组件,上传任意文件大小时始终占用128KB内存。 5. 支持文件文件夹拖拽上传功能。 6. 支持文件批量上传。 7. 支持文件上传。 8. 基于标准HTTP协议。 9. 免费提供JavaScript SDK包,方便您将插件快速集成到已有网站中。 支持语言:PHP,JSP,ASP,ASP.NET(C#),ASP.NET(VB),C++,VC,VC.NET,VB,VB.NET,C#,C#.NET,Delphi,C++Builder 支持平台:Visual Studio 6.0/2002/2003/2005/2008/2010,C++ Builder 6.0/2009/2010,Delphi 7/2009,Visual Basic 6.0/2008,MyEclipse8.x 支持脚本:JavaScript,VBScript 支持服务器:Windows NT,Windows 2003,Windows XP,Windows Vista,Windows 7,Linux,Unix 支持浏览器:IE6,IE7,IE8,360安全浏览器,QQ浏览器,搜狐浏览器,Maxthon(遨游)浏览器1.X,Maxthon(傲游)浏览器2.x 支持文件大小:2G~8EB(1EB=102PB,1PB=1024TB,1TB=1024GB) 支持文件类型:任意类型 版权所有 2009-2012 武汉命运科技有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/http-uploader3/index.aspx 在线演示:http://www.ncmem.com/products/http-uploader3/demo/index.html 产品介绍:http://www.cnblogs.com/xproer/archive/2012/05/29/2523757.html 开发文档-ASP:http://www.cnblogs.com/xproer/archive/2012/02/17/2355458.html 开发文档-PHP:http://www.cnblogs.com/xproer/archive/2012/02/17/2355467.html 开发文档-JSP:http://www.cnblogs.com/xproer/archive/2012/02/17/2355462.html 开发文档-ASP.NET:http://www.cnblogs.com/xproer/archive/2012/02/17/2355469.html 升级日志:http://www.cnblogs.com/xproer/archive/2012/02/17/2355449.html 示例下载:http://www.ncmem.com/download/HttpUploader4-demo.rar 文档下载:http://www.ncmem.com/download/HttpUploader4-doc.rar 镜像下载(DBank):cab安装包,开发文档 镜像下载(JSP):cab安装包,开发文档,ASP.NET-ACCESS示例,JSP-ACCESS示例(GB2312),JSP-ACCESS示例(UTF-8),JSP-Sql2005示例(UTF-8),JSP-MySQL示例(UTF-8) 镜像下载(PHP):MySQL示例(UTF-8) 问题反馈:http://www.ncmem.com/blog/guestbook.asp 数字证书补丁:http://www.ncmem.com/download/rootsupd.rar VC运行库:http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=29 联系信箱:1085617561@qq.com 联系QQ:1085617561 技术QQ:1269085759
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值