虚拟主机 如何上传大于100M的文件 php网站程序

问题

  1. 虚拟主机上传文件大小限制100m,

  2. 有时会遇到非常大的文件上传,上传过程中耗时非常久,

  3. 可能服务器的限制设置了上传文件尺寸,返回“413 request entity too large”

整体逻辑

  1. 前端:上传文件时,进行文件分片;发起请求时,带上第几次分片上传、总片数。

  2. 后端:按照分片进行文件保存,当上传完最后一片数据时,进行文件合并,并删除分片文

示例代码 下载:  http://downinfo.myhostadmin.net/upload.zip

只是演示功能,生产环境需要加强上传过滤

前端 upload.html 




分片上传



后端 upload.php

 500];
    echo json_encode($res);
    exit;
}
// 创建上传目录
if(!is_dir('upload')){
   mkdir('upload', 0777);
 }
// 创建上传缓存目录
if(!is_dir('tmp')){
   mkdir('upload', 0777);
 }
 
$fileName          = isset($_POST['fileName'])?$_POST['fileName']:'';
$page              = isset($_POST['page'])?$_POST['page']:'';
$totalPage         = isset($_POST['totalPage'])?$_POST['totalPage']:'';

$fileTmpName       = isset($_FILES['file'])?$_FILES['file']['tmp_name']:'';

$status  = 206;
$downUrl = '';



if ($fileName== ''|| $page == '' || $totalPage == '' || $fileTmpName == '') {
    $res = ['status' => 500];
    echo json_encode($res);
    exit();
}




// 上传文件要保存的路径
$fname = sprintf('./tmp/%s-%s', $fileName, $page);
$data  = file_get_contents($fileTmpName);
file_put_contents($fname, $data);

// 整合分片文件
//if ($save) {
if ($totalPage ==$page) {
    $uploadFileName = sprintf('./upload/%s%s', time(),$fileName); 
    $status         = 200;
    // 合并文件,删除分片文件  
    for ($i = 0; $i<=$totalPage; $i++) {
        $tmp =  sprintf('./tmp/%s-%s', $fileName, $i);
        $data = file_get_contents($tmp);
        file_put_contents($uploadFileName, $data, FILE_APPEND);
        @unlink($tmp);
    }

    $dir = trim(dirname($_SERVER['PHP_SELF']), '/');
    if ($dir!='') {
      $dir .= '/';
    }

    $downUrl = sprintf('%s://%s/%s%s', $_SERVER['REQUEST_SCHEME'], $_SERVER['HTTP_HOST'], $dir,trim($uploadFileName, './'));
    $res = ['status' => $status,'downUrl' => $downUrl];
    echo json_encode($res);
    exit();
}

// 返回上传状态
$res = ['status' => $status,'downUrl' => $downUrl];
echo json_encode($res);

运行效果

虚拟主机 如何上传大于100M的文件 php网站程序_第1张图片

你可能感兴趣的:(虚拟主机,PHP,PHP网站程序,上传文件)