楼主: yzy008
68 0

[图行天下] 国企 央企的.NET项目中C#怎样实现大文件的断点续传? [推广有奖]

  • 0关注
  • 0粉丝

准贵宾(月)

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
996 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-7-29
最后登录
2018-7-29

楼主
yzy008 发表于 2025-11-21 07:42:50 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

大三学生的暴富(毕业)设计日记

大家好!我是来自福州的一名大三通信工程专业的学生小王,最近因为毕业设计的压力,几乎要秃头了。我的任务是开发一个“文件管理系统”,需要支持10GB文件的上传、加密传输、断点续传,而且还要兼容IE8浏览器。

更令人头疼的是,导师还特别要求使用原生JavaScript、Vue3和ASP.NET WebForm来完成,说是“加强基础技能训练”。说实话,我对Vue3的一些高级特性还不是很熟悉,但经过连续三天三夜的努力(主要是疯狂地百度搜索、翻墙访问GitHub以及在QQ群中求助),终于找到了一个可以运行的解决方案!现在就把我发现的技术实现方法和一些心得与大家分享一下。

技术实现方案(能运行即可版本)

前端部分(原生JS + Vue3 兼容写法)

这是一个用于大文件上传的系统,专为毕业设计定制。

.uploader-container { width: 500px; margin: 20px auto; }
.btn { padding: 8px 16px; background: #4CAF50; color: white; border: none; cursor: pointer; }
.progress { width: 100%; height: 20px; background: #ddd; margin-top: 10px; }
.progress-bar { height: 100%; background: #4CAF50; width: 0%; }

上传状态: {{ status }}

        // 初始化上传功能
        const initUploader = (file) => {
            files.push({
                name: file.name,
                size: file.size,
                uploadedBytes: file.uploadedBytes || 0
            });
            localStorage.setItem('upload_progress', JSON.stringify(files));
        };

        // 恢复上传进度
        const restoreProgress = () => {
            const savedProgress = localStorage.getItem('upload_progress');
            if (savedProgress) {
                const files = JSON.parse(savedProgress);
                // 将恢复的文件重新加入到上传队列中
                status.value = `检测到未完成的上传任务,共计 ${files.length} 个文件`;
            }
        };

        // 将字节转换为人类可读的文件大小格式
        const formatSize = (bytes) => {
            if (bytes === 0) return '0 字节';
            const kilobyte = 1024;
            const units = ['字节', 'KB', 'MB', 'GB'];
            const unitIndex = Math.floor(Math.log(bytes) / Math.log(kilobyte));
            return parseFloat((bytes / Math.pow(kilobyte, unitIndex)).toFixed(2)) + ' ' + units[unitIndex];
        };

        // 在组件挂载时初始化并恢复进度
        onMounted(() => {
            initUploader();
            restoreProgress();
        });

        // 返回用于模板绑定的对象
        return { progress, status, startUpload, pauseUpload };
    
        // 后端处理部分(ASP.NET WebForm 简化版)
        // UploadHandler.ashx (处理文件上传请求)
        <%@ WebHandler Language="C#" Class="UploadHandler" %>
        using System;
        using System.IO;
        using System.Web;
        using System.Security.Cryptography;

        public class UploadHandler : IHttpHandler
        {
            public void ProcessRequest(HttpContext context)
            {
                context.Response.ContentType = "text/plain";
                try
                {
                    HttpPostedFile uploadedFile = context.Request.Files["file"];
                    string currentChunk = context.Request["chunk"]; // 当前分片编号
                    string totalChunks = context.Request["chunks"]; // 分片总数
                    string originalFileName = context.Request["name"]; // 原始文件名
                    string userIdentifier = context.Request["userId"]; // 用户标识符(用于加密)

                    // 1. 根据用户ID创建临时目录
                    string temporaryDirectory = Path.Combine(@"D:\UploadTemp", userIdentifier);
                    if (!Directory.Exists(temporaryDirectory)) Directory.CreateDirectory(temporaryDirectory);

                    // 2. 存储当前分片
                    string temporaryFilePath = Path.Combine(temporaryDirectory, $"{originalFileName}.part{currentChunk}");
                    uploadedFile.SaveAs(temporaryFilePath);

                    // 3. 如果是最后一个分片,则合并所有分片
                    if (currentChunk == totalChunks)
                    {
                        string finalFilePath = Path.Combine(@"D:\Uploads", originalFileName);
                        MergeFiles(temporaryDirectory, originalFileName, finalFilePath);

                        // 4. 对最终文件进行加密存储
                        EncryptFile(finalFilePath, "your-secret-key");
                        context.Response.Write("{\"status\":\"success\"}");
                    }
                    else
                    {
                        context.Response.Write("{\"status\":\"continue\"}");
                    }
                }
                catch (Exception ex)
                {
                    context.Response.Write($"{{\"error\":\"{ex.Message}\"}}");
                }
            }

            // 实现IHttpHandler接口
            public bool IsReusable => false;
        }
    

在处理错误响应时,可以通过以下方式来编写:

context.Response.Write("{\"status\":\"error\", \"message\":\"" + ex.Message + "\"}");
}

下面是关于合并分片文件的方法:

private void MergeFiles(string tempDir, string fileName, string outputPath)
{
    string[] partFiles = Directory.GetFiles(tempDir, $"{fileName}.part*");
    Array.Sort(partFiles);
    using (FileStream fs = new FileStream(outputPath, FileMode.Create))
    {
        foreach (string part in partFiles)
        {
            byte[] bytes = File.ReadAllBytes(part);
            fs.Write(bytes, 0, bytes.Length);
            File.Delete(part); // 清除临时分片
        }
    }
}

对于AES加密文件的实现,可以参考以下代码:

private void EncryptFile(string inputFile, string secretKey)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = Encoding.UTF8.GetBytes(secretKey.PadRight(32).Substring(0, 32));
        aes.IV = new byte[16]; // 注意,在实际应用中应使用随机初始化向量
        using (FileStream fsCrypt = new FileStream(inputFile + ".enc", FileMode.Create))
        using (ICryptoTransform encryptor = aes.CreateEncryptor())
        using (CryptoStream cs = new CryptoStream(fsCrypt, encryptor, CryptoStreamMode.Write))
        using (FileStream fsIn = new FileStream(inputFile, FileMode.Open))
        {
            fsIn.CopyTo(cs);
        }
    }
    File.Delete(inputFile); // 移除原始文件
}

属性定义:

public bool IsReusable => false;

实现财富增长的策略(正式版本)

利用QQ群进行盈利

群号码:374992201(新成员入群可领取1-99元红包)

推广机制:成功推荐客户完成交易可获得20%佣金(例如,促成1万元交易即可获得2000元佣金!)

代理计划:轻松赚取差价,比编程更简单

毕业设计的商业化策略

将此功能封装为“毕业设计模板”

定价策略:基础版免费提供,高级版(支持10GB上传)需付费

目标市场:主要销售给低年级同学,他们对此类功能需求迫切

成本管理技巧:

  • 后端采用ASP.NET(利用学校实验室的免费服务器)
  • 前端采用WebUploader(开源且免费)
  • 加密技术使用AES(.NET框架自带功能)

实际案例分析

上周通过该方案帮助同学实现了项目:

  • 开发成本:无(全部使用开源工具)
  • 部署成本:无(借助学校实验室的服务器)
  • 同学报价:800元(导师认为非常划算)
  • 净利润:800元(毛利率达100%)

目前每天在群内发布广告,已有3位学弟表现出兴趣!按照这样的进度,毕业前就能实现福州奶茶自由了!

特别推广

各位朋友,是否因为毕业设计而熬夜脱发?加入我们的QQ群,共同实现“复制粘贴”式的毕业吧!这里不仅提供技术变现、资源对接,还有项目分包等服务!现在加入还能参加“推荐客户赢取iPhone14”的活动哦!

群号码:374992201(暗号:我要毕业)

备注:实际开发过程中需要注意处理各种边缘情况,以上代码仅展示核心逻辑,实际项目中务必确保异常处理和安全措施到位!

附言:有福州的师兄师姐能推荐工作机会吗?即将毕业,希望能在福州找到前端或通信相关的工作,感谢推荐!

环境搭建指南

安装.NET Framework 4.7.2

请访问:.NET Framework 4.7.2下载页面

选择框架版本4.7.2

添加第三方库引用

编译项目

NOSQL数据库

NOSQL无需任何配置即可直接访问页面进行测试。

SQL数据库与IIS的使用

对于大文件上传测试,建议使用IIS以获得更高的性能。

对于小文件上传测试,可以使用IIS Express。

创建数据库

配置数据库连接信息

验证数据库配置

访问页面进行测试

相关参考资料

文件存储位置:

效果预览:

文件上传:

文件刷新续传功能确保了用户在关闭或刷新浏览器后,仍能保持文件的上传进度,避免了因意外中断而造成的进度丢失。

文件夹上传功能不仅支持整个文件夹的上传,同时还能保持原有的层级结构。此外,该功能还具备离线保存进度的能力,即使在刷新页面、关闭页面或重启系统后,也能保留上传进度。

用户可以通过下载完整示例来更好地了解和使用这些功能。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:NET Cryptography Background percentage Javascript

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-9 07:30