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

news2024/12/28 19:15:00

问题

  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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue前端开发自学,组件的嵌套关系demo

vue前端开发自学,组件的嵌套关系demo!今天开始分享的&#xff0c;前端开发经常用到的&#xff0c;组件的嵌套关系案例代码。下面先给大家看看&#xff0c;代码执行效果。 如图&#xff0c;这个是代码执行后&#xff0c;的效果布局&#xff01; 下面给大家贴出来源码。方便大家…

C++_vector类

目录 一、vector的模拟实现 1、vector的组成结构 2、vector尾插数据 2.1 析构函数 3、迭代器实现 4、resize 5、删除数据 5.1 迭代器失效 6、指定位置插入数据 6.1 迭代器失效 7、迭代器构造和resize构造 8、深浅拷贝 结语&#xff1a; 前言&#xff1a; vect…

Vue3:使用解构赋值来读取对象里的键-值对(值也是对象)

一、前言 在Vue3中&#xff0c;想要读取一个对象的“键—值”对&#xff08;值也是一个对象&#xff09;&#xff0c;数据格式如下&#xff1a; {1:{courseName: 课程1, study: 951526, visit: 3785553}&#xff0c;2:{courseName: 课程2, study: 181630, visit: 380830}&…

Open CV 图像处理基础:(五)Java 使用 Open CV 的绘图函数

Java 使用 Open CV 的绘图函数 使用 Open CV 在 Java 中对图片使用绘图函数&#xff0c;分别绘制矩形、斜线、圆形、椭圆形以及添加文本 Java 使用 Open CV 的绘图函数 Java 使用 Open CV 的绘图函数函数绘制矩形绘制线绘制圆形绘制椭圆添加文本 代码示例 函数 绘制矩形 Im…

创新工具:2024年开发者必备的一款表格控件

前言 在现代工作环境中&#xff0c;信息的处理和管理是至关重要的。表格是一种常见的数据呈现和整理工具&#xff0c;被广泛应用于各行各业。然而&#xff0c;随着技术的不断发展&#xff0c;市场对表格控件的需求也越来越高。随着工作效率的重要性日益凸显&#xff0c;一款高…

卢森堡市场开发攻略,带你走进全球最富有的国家

卢森堡位于西欧&#xff0c;位于欧洲的十字路口&#xff0c;地理位置非常重要。卢森堡是高度发达的资本主义国家&#xff0c;人均gdp全球最高&#xff0c;是当之无愧的全球最富国家。卢森堡对外开放度高&#xff0c;很多产品依赖进口&#xff0c;也是一个非常不错的市场&#x…

Qt/Qt Creator窗体界面集成自定义类Ribbon工具栏-代码自定义实现-非第三方工具插件

程序示例精选 Qt/Qt Creator窗体界面集成自定义类Ribbon工具栏-完全代码自定义实现-非第三方工具插件 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Qt/Qt Creator窗体界面集成自定义类Ri…

小红书复盘思路总结,达人笔记投放规划

完成了一次小红书投放&#xff0c;是否任务就结束了?事实并非如此&#xff0c;投放的过程很重要的&#xff0c;但投放结束之后的复盘更重要。今天&#xff0c;我们针对小红书复盘思路总结&#xff0c;达人笔记投放规划&#xff01;和大家来分享下。 小红书复盘思路主要可以分为…

计算数学表达式的程序(Java课程设计)

1. 课设团队介绍 团队名称 团队成 员介绍 任务分配 团队成员博客 XQ Warriors 徐维辉 负责计算器数据的算法操作&#xff0c;如平方数、加减乘除&#xff0c;显示历史计算记录 无 邱良厦&#xff08;组长&#xff09; 负责计算器的图形设计&#xff0c;把输入和结果显…

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

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

pandas笔记:找出在一个dataframe但不在另一个中的index

1 问题描述 假设我们有两个dataframe&#xff08;这一段代码&#xff09;来自transbigdata 笔记&#xff1a;官方文档案例1&#xff08;出租车GPS数据处理&#xff09;-CSDN博客 data tbd.clean_outofshape(data, sz, col[Lng, Lat], accuracy500) data data2 tbd.clean_ta…

Python爬虫之Scrapy框架系列(24)——分布式爬虫scrapy_redis完整实战【XXTop250完整爬取】

目录&#xff1a; 1.使用分布式爬取XX电影信息&#xff08;1&#xff09;settings.py文件中的配置&#xff1a;&#xff08;2&#xff09;spider文件的更改&#xff1a;&#xff08;3&#xff09;items.py文件&#xff08;两个项目一致&#xff01;&#xff09;&#xff1a;&am…

回归预测 | Matlab基于CPO-BP基于冠豪猪算法优化BP神经网络的数据多输入单输出回归预测

回归预测 | Matlab基于CPO-BP基于冠豪猪算法优化BP神经网络的数据多输入单输出回归预测 目录 回归预测 | Matlab基于CPO-BP基于冠豪猪算法优化BP神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CPO-BP回归基于冠豪猪优化算法[24年新…

产品使用说明书也能进行SEO?要怎么制作才能使其易于搜索?

产品使用说明书也能进行SEO&#xff1f;是的&#xff0c;你没有听错&#xff0c;不过是在线化的产品使用说明书。产品使用说明书能通过特定的策略和技巧进行搜索引擎优化&#xff08;SEO&#xff09;。这不只是为了让产品信息更易被找到&#xff0c;更是为了提升品牌知名度和用…

【Linux】应用与驱动交互及应用间数据交换

一、应用程序与 Linux 驱动交互主要通过以下几种方式&#xff1a; 1. 系统调用接口&#xff08;System Calls&#xff09;: 应用程序可以通过系统调用&#xff0c;如 open(), read(), write(), ioctl(), 等来与设备驱动进行交互。这些调用最终会通过内核转发到相应的驱动函数…

【分布式微服务专题】从单体到分布式(四、SpringCloud整合Sentinel)

目录 前言阅读对象阅读导航前置知识一、什么是服务雪崩1.1 基本介绍1.2 解决方案 二、什么是Sentinel2.1 基本介绍2.2 设计目的2.3 基本概念 三、Sentinel 功能和设计理念3.1 流量控制3.2 熔断降级3.3 系统负载保护 四、Sentinel 是如何工作的 笔记正文一、简单整合Sentinel1.1…

uniapp日期加减切换,点击切换

先上完成后的页面&#xff1a;当前年年份不显示&#xff0c;不然完整显示。 可以切换和自定义选择。 html:样式和图片自定义。 <view class"image-text_30"><image click"delMonth" :src"require(/static/home/zuo.png)" class"…

最新消息:OpenAI GPT Store 正式上线,GPTs 应用商店来了!

原文链接 https://openaigptguide.com/gpt-store-and-chatgpt-team/ OpenAI推出的两款新产品和服务&#xff1a;GPT Store和ChatGPT Team&#xff0c;提供了许多全新的解决方案和功能&#xff0c;旨在帮助用户更轻松地使用和构建GPT工具&#xff0c;同时也增加了公司的收入来源…

VINS-MONO拓展2----更快地makeHessian矩阵(p_thread, OpenMP, CUDA, tbb)

1. 目标 完成大作业T2 作业提示&#xff1a; 多线程方法主要包括以下几种(参考博客)&#xff1a; MPI(多主机多线程开发),OpenMP(为单主机多线程开发而设计)SSE(主要增强CPU浮点运算的能力)CUDAStream processing, 之前已经了解过std::thread和pthread&#xff0c;拓展1…

Unity中URP下实现能量罩(交接处高亮)

文章目录 前言一、交接处高亮 原理1、 我们先用一个球作为能量罩、一个Cube 和 一个 椭球 作为与能量罩交接的物体2、 这是我们目前场景的深度图3、使能量罩为 半透明渲染队列 且 关闭深度写入 不渲染深度图 二、交接处高亮 实现1、得到深度图2、在片元着色器中&#xff0c;对深…