大三学生的暴富(毕业)设计日记
大家好!我是来自福州的一名大三通信工程专业的学生小王,最近因为毕业设计的压力,几乎要秃头了。我的任务是开发一个“文件管理系统”,需要支持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
选择框架版本4.7.2
添加第三方库引用
编译项目
NOSQL数据库
NOSQL无需任何配置即可直接访问页面进行测试。
SQL数据库与IIS的使用
对于大文件上传测试,建议使用IIS以获得更高的性能。
对于小文件上传测试,可以使用IIS Express。
创建数据库
配置数据库连接信息
验证数据库配置
访问页面进行测试
相关参考资料
文件存储位置:
效果预览:
文件上传:

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

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

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


雷达卡


京公网安备 11010802022788号







