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

问题

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

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

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

整体逻辑

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

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

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

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

前端 upload.html 

<html>
<head>
<meta charset="utf-8">
<title>分片上传</title>
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
</head>
<body>
<form method="post" id="myForm" enctype="multipart/form-data">
    <input type="file" id="file" name="file">
    <input type="submit" id="submit" value="上传">
</form>


<script type="text/javascript">
    $('#submit').on('click', function(e) {
        // 阻止默认表单提交
        e.preventDefault();

        // 获取属性
        var myfile = $('#file')[0].files[0];
        var ext = myfile.name.split('.').pop();
        // 判断ext是否为视频
        var is_video = ['mp4', 'avi', 'rmvb', 'mkv'].indexOf(ext) > -1;
        var fileId = getFileIdentifier(myfile);
        // 数据切片
        var chunks = fileSlice(myfile, is_video);
        console.log(chunks)
        // 发送分割数据段
        sendChunk(fileId, chunks);
    })
    function getFileIdentifier(file){
     // 获取文件标识符
     return file.name
     //return file.size + file.name;
   }
   function fileSlice(file, is_video) {
     // 切片不宜过大,过大需要 nginx 以及 php 做相应配置
        var chunkSize =  1024 * 1024 * 4;  //切片大小控制
        // 1.初始化数据
        var totalSize = file.size;
        var start = 0;
        var end = start + chunkSize;
        var chunks = [];
        // 2.使用bolb提供的slice方法切片
        while (start < totalSize) {
            if (is_video) {
                console.log('视频')
                var chunk = file.slice(start, end, 'video/mp4');
            } else {
                console.log('图片')
                var chunk = file.slice(start, end);
            }
            chunks.push(chunk);
            start = end;
            end += chunkSize;
        }
        // 3.返回切片组chunk[]
        return chunks;
    }
    function sendChunk(id, chunks){
        // 逐个提交
        // 用于保证ajax发送完毕
        var task = [];
        var totalPage=0;
        var i=0;
        totalPage=chunks.length-1;
        var fileExt = id.substr(id.lastIndexOf('.') + 1);

        chunks.forEach(function(chunk, index){
            var formData = new FormData();
            formData.append('file',chunk);
            formData.append("fileName",id);
            formData.append("totalPage",totalPage);
            formData.append("page",index);
            $.ajax({
                type: "POST",
                url: 'upload.php',
                data: formData,
                contentType: false,
                processData: false,
                dataType:"json",
                async:false,
                success: function(data){
                    // 移除已完成任务
                    task.pop();
                    if (data['status']==200){
                        console.log(data['downUrl']);
                        alert(data['downUrl']); //返回上传文件路径
                    }
                }
                })
            task.push('file Working');
        })
    }
</script>
</body>
</html>

后端 upload.php

<?php
if (empty($_POST)) {
    $res = ['status' => 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);

运行效果

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/310065.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高精度彩色3D相机:开启崭新的彩色3D成像时代

3D成像的新时代 近年来&#xff0c;机器人技术的快速发展促使对3D相机技术的需求不断增加&#xff0c;原因在于&#xff0c;相机在提高机器人的性能和实现多种功能方面发挥了决定性作用。然而&#xff0c;其中许多应用所需的解决方案更复杂&#xff0c;仅提供环境的深度信息是…

Linux CentOS 7.6安装nginx详细保姆级教程

一、通过wget下载nginx压缩包 1、进入home文件并创建nginx文件夹用来存放nginx压缩包 cd /home //进入home文件夹 mkdir nginx //创建nginx文件夹 cd nginx //进入nginx文件夹2、下载nginx,我这里下载的是Nginx 1.24.0版本&#xff0c;如果要下载新版本可以去官网进行下载:…

ChatGPT付费创作系统V2.5.5独立版+前端

ChatGPT付费创作系统V2.5.5版本优化了很多细节&#xff0c;功能增加增加长篇写作功能。该版本为编译版无开源&#xff0c;本版本特别处理了后台弹窗、暗链网址。特别优化了数据库。升级过程中未发现任何BUG&#xff0c;全新安装或者升级安装均未出现400或者500错误&#xff0c;…

LeetCode刷题--- 地下城游戏

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

降低运营成本:采用安全托管服务(Managed Security Service,MSS)

文章目录 安全托管服务(MSS)?安全托管服务的内容安全风险评估安全监控预警安全应急响应安全问题咨询 企业为什么需要安全托管服务&#xff1f;与MSS合作的好处是什么&#xff1f;MSP和MSSP有何区别&#xff1f;MSSP如何向客户呈现服务内容企业可以托管哪些网络资产威胁管理托管…

算法训练营第四十二天|动态规划:01背包理论基础 416. 分割等和子集

目录 动态规划&#xff1a;01背包理论基础416. 分割等和子集 动态规划&#xff1a;01背包理论基础 文章链接&#xff1a;代码随想录 题目链接&#xff1a;卡码网&#xff1a;46. 携带研究材料 01背包问题 二维数组解法&#xff1a; #include <bits/stdc.h> using namesp…

楼宇管理新智慧:Panorama SCADA楼宇管理系统应用实例

一、背景介绍 楼宇管理系统旨在集中控制和监测楼宇运营&#xff0c;涵盖暖通空调&#xff08;HVAC&#xff09;、照明、电力系统、消防和安全系统等。通过直观的用户界面&#xff0c;用户得以实时监测和精准掌控这些系统&#xff0c;从而提升能源效率、确保设备正常运行&#…

Python - Bert-VITS2 语音推理服务部署

目录 一.引言 二.服务搭建 1.服务配置 2.服务代码 3.服务踩坑 三.服务使用 1.服务启动 2.服务调用 3.服务结果 四.总结 一.引言 上一篇文章我们介绍了如果使用 conda 搭建 Bert-VITS2 最新版本的环境并训练自定义语音&#xff0c;通过 1000 个 epoch 的训练&#xf…

如何彻底卸载Edge

要彻底卸载Edge浏览器&#xff0c;你可以按照以下几种方法操作&#xff1a; 方法一&#xff1a;使用控制面板 点击任务栏的“开始”按钮&#xff0c;打开“控制面板”。在控制面板中&#xff0c;选择“程序和功能”。在程序列表中找到Edge浏览器&#xff0c;右键点击它并选择…

如何使用ChemiCloud搭建WordPress外贸站完全指南(2024)

ChemiCloud是一家成立于2016年的云虚拟主机提供商&#xff0c;他们在全球范围内设有多个机房&#xff0c;并提供高性价比的服务。作为市场上最出色的WordPress外贸主机之一&#xff0c;ChemiCloud经过小编两个月的监控测试表现出色。 ChemiCloud的正常运行时间达到了99.99%&am…

工业以太网的网络安全与数据传输性能

工业以太网主要是一种用于工业控制系统的网络通信协议&#xff0c;它基于以太网技术&#xff0c;将其应用于工业环境中&#xff0c;以实现高速、可靠、安全的数据传输。跟传统的专用工业网络比较&#xff0c; 工业以太网具有更大的带宽、更低的成本以及更好的扩展性&#xff0c…

What does `wget -O` do?

wget -O 下载文件 并 重命名 wget -O 会 显示下载过程 wget -o 不会 显示下载过程 wget http://download.redis.io/releases/redis-4.0.9.tar.gz -O /usr/local/src/redis.tar.gz 或者 wget -O /usr/local/src/redis.tar.gz http://download.redis.io/releases/redis-…

爬虫01-爬虫原理以及爬虫前期准备工作

文章目录 1 爬虫基本原理什么是爬虫爬虫功能详解爬虫基本流程两个概念&#xff1a;request和response 2 一些问题爬虫能抓取什么样的数据&#xff1f;抓取的数据怎么提取部分内容&#xff1f;数据解析方式。为什么我爬虫抓取的数据和浏览器看到的不一样怎样解决JavaScript渲染的…

【办公技巧】Excel单元格隐藏的部分如何显示出来

Excel工作表中的有些单元格隐藏了数据&#xff0c;如何取消隐藏行列呢&#xff1f;今天分享几个方法给大家 方法一&#xff1a; 选中隐藏的区域&#xff0c;点击右键&#xff0c;选择【取消隐藏】就可以了 方法二&#xff1a; 如果工作表中有多个地方有隐藏的话&#xff0c;…

SpringBoot+Vue药品ADR不良反应智能监测系统源码

药品不良反应&#xff08;Adverse Drug Reaction&#xff0c;ADR&#xff09;是指合格药品在正常用法用量下出现的与用药目的无关的有害反应&#xff0c;不包括超说明书用药、药品质量问题等导致的不良后果。 ADR智能监测系统开发环境 ❀技术架构&#xff1a;B/S ❀开发语言&…

Hbuilder X 设置格式化代码时清除空白行

将 preserve_newlines 的值改为 false "preserve_newlines": false, //保留空行

Prometheus实战篇:Prometheus监控docker

Prometheus实战篇:Prometheus监控docker 准备环境 监控docker 为了能够获取到Docker容器的运行状态,用户可以通过Docker的stats命令获取当前主机上运行容器的统计信息,可以查看容器的CPU利用率,内存使用量,网络IO总量以及磁盘IO总量等信息. docker stats除了使用命令以外,用户…

番外篇-区块链基础知识入门

今天聊聊番外篇之Web3、区块链的基础知识~ 1. 区块链是如何工作的&#xff1f; Hash算法 将输入的数据映射为一个固定长度的字符串字符串是64长度&#xff0c;16进制&#xff08;2^4&#xff09;&#xff0c;4 * 64 256【SHA256】hash演示&#xff1a;https://andersbrownwo…

idea试用到期,重新试用

版本号&#xff1a;2021.2.* 打开运行 删除以下内容 1. 计算机注册表 \HKEY_CURRENT_USER\Software\JavaSoft\Prefs\Jetbrains 2. 文件夹 C:\Users\用户名\AppData\Roaming\JetBrains\IntelliJIdea C:\Users\用户名\AppData\Local\JetBrains\IntelliJIdea 以上仅用于临时使用…

Spring MVC 参数接收

参数接收 Springmvc中&#xff0c;接收页面提交的数据是通过方法形参来接收&#xff1a; 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型&#xff0c;所以spirngmvc提供了很多converter&#xff08;转换器…