文件分块上传 生成多个part文件 如何合并能 求大神指教

querystringcom 2016-04-28 04:52:07
private string WriteTempFile(HttpPostedFile uploadFile, int chunk)
{

string tempDir = FileHelper.GetTempPath();
if (!Directory.Exists(tempDir))
{
Directory.CreateDirectory(tempDir);
}
string fullName = string.Format("{0}\\{1}.part", tempDir, uploadFile.FileName);
if (chunk == 0)
{
//如果是第一个分块,则直接保存

uploadFile.SaveAs(fullName);
}
else
{
//如果是其他分块文件 ,则原来的分块文件,读取流,然后文件最后写入相应的字节
FileStream fs = new FileStream(fullName, FileMode.Append);
if (uploadFile.ContentLength > 0)
{
int FileLen = uploadFile.ContentLength;
byte[] input = new byte[FileLen];

// Initialize the stream.
System.IO.Stream MyStream = uploadFile.InputStream;

// Read the file into the byte array.
MyStream.Read(input, 0, FileLen);

fs.Write(input, 0, FileLen);
fs.Close();
}
}


return fullName;
}


上面的方法 把大文件分成4份

文件分成了4块
blob1461832382735.part
blob1461832382845.part
blob1461832384235.part
blob1461832385635.part

怎么合并?
...全文
905 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
业务逻辑设计太不成熟了,万一上传次序不是顺序的呢?万一有两个块是(准)并发地上传的呢?万一中间少一块文件呢? 等等地,业务逻辑设计太幼稚,说明你没有用心思考(设计流程图),就急着写代码了。
秋的红果实 2016-05-08
  • 打赏
  • 举报
回复
感觉你分块的这个方法有问题,合并嘛,在一个文件的尾部追加另一个就行
xuzuning 2016-05-05
  • 打赏
  • 举报
回复
以追加方式打开文件就可以了
mjp1234airen4385 2016-05-05
  • 打赏
  • 举报
回复
引用 4 楼 querystringcom 的回复:
[quote=引用 3 楼 querystringcom 的回复:] [quote=引用 1 楼 mjp1234airen4385 的回复:] 你这已经合并了啊,稍微改动下。 fs.Seek(0,SeekOrigin.End); fs.Write(input, 0, FileLen); fs.flush(); fs.close();
并没有合并啊[/quote] WriteTempFile这个方法 是用来分块的 比如一个50M的文件要上传 20M为一块 那么WriteTempFile方法会执行三次 生成3个xxx.part的文件 但是都是分开的 并没有合并[/quote] 首先,你要标识清楚哪些文件块是同一个文件的,并且要标明顺序。比如:一个文件abcd.rar,分成4块abcd1.rar、abcd2.rar、abcd3.rar、abcd4.rar。 在服务端接收完这个文件,就用你这段代码: //如果是其他分块文件 ,则原来的分块文件,读取流,然后文件最后写入相应的字节 FileStream fs = new FileStream(fullName, FileMode.Append); if (uploadFile.ContentLength > 0) { int FileLen = uploadFile.ContentLength; byte[] input = new byte[FileLen]; // Initialize the stream. System.IO.Stream MyStream = uploadFile.InputStream; // Read the file into the byte array. MyStream.Read(input, 0, FileLen); fs.Write(input, 0, FileLen); fs.Close(); } 打开文件abcd1.rar,定位到文件结尾,再新建一个filestream打开文件abcd2.rar,定位到开头(默认开头),把abcd2.rar对应的文件流内容写入到abcd1.rar对应的文件流,循环把所有的文件块都写入,就OK了
querystringcom 2016-05-03
  • 打赏
  • 举报
回复
沉了 顶一下
querystringcom 2016-05-03
  • 打赏
  • 举报
回复
引用 3 楼 querystringcom 的回复:
[quote=引用 1 楼 mjp1234airen4385 的回复:] 你这已经合并了啊,稍微改动下。 fs.Seek(0,SeekOrigin.End); fs.Write(input, 0, FileLen); fs.flush(); fs.close();
并没有合并啊[/quote] WriteTempFile这个方法 是用来分块的 比如一个50M的文件要上传 20M为一块 那么WriteTempFile方法会执行三次 生成3个xxx.part的文件 但是都是分开的 并没有合并
querystringcom 2016-05-03
  • 打赏
  • 举报
回复
引用 1 楼 mjp1234airen4385 的回复:
你这已经合并了啊,稍微改动下。 fs.Seek(0,SeekOrigin.End); fs.Write(input, 0, FileLen); fs.flush(); fs.close();
并没有合并啊
mjp1234airen4385 2016-04-28
  • 打赏
  • 举报
回复
你这已经合并了啊,稍微改动下。 fs.Seek(0,SeekOrigin.End); fs.Write(input, 0, FileLen); fs.flush(); fs.close();

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧