求快速上传文件的源码

BitSoftStudio 2014-01-24 04:59:13
最近的项目需要实现大文件的快速上传到服务器,支持多线程及断点续传。求源代码或思路。
...全文
257 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
BitSoftStudio 2014-01-25
  • 打赏
  • 举报
回复
能把整体的源代码发给我参考一下吗?
引用 9 楼 duanzi_peng 的回复:
[quote=引用 7 楼 BitSoftStudio 的回复:] 算,有合适的吗? [quote=引用 6 楼 duanzi_peng 的回复:] [quote=引用 4 楼 BitSoftStudio 的回复:] B/S结构不太合适。 有.net调用的C/S结构的源代码吗或实现方法吗?
cs可以向服务器上传2g的算吗??[/quote][/quote]

void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            // 要上传的文件地址
            FileStream fs = File.OpenRead(fileInfoIO.FullName);
            // 实例化服务客户的
            ServiceFileClient client = new ServiceFileClient();
            try
            {
                string path = e.Argument.ToString();
                int maxSiz = 1024 * 100;
                System.IO.FileInfo fileInfoIO = new System.IO.FileInfo(path);

                // 根据文件名获取服务器上的文件

                CustomFileInfo file = client.GetFileInfo(fileInfoIO.Name);

                if (file == null)
                {
                    file = new CustomFileInfo();
                    file.OffSet = 0;
                }
                file.Name = fileInfoIO.Name;
                file.Length = fs.Length;

                if (file.Length == file.OffSet) //如果文件的长度等于文件的偏移量,说明文件已经上传完成
                {
                    MessageBox.Show("该文件已存在");
                    e.Result = false;   // 设置异步操作结果为false
                }
                else
                {
                    while (file.Length != file.OffSet)
                    {
                        file.SendByte = new byte[file.Length - file.OffSet <= maxSiz ? file.Length - file.OffSet : maxSiz]; //设置传递的数据的大小

                        fs.Position = file.OffSet; //设置本地文件数据的读取位置
                        fs.Read(file.SendByte, 0, file.SendByte.Length);//把数据写入到file.Data中
                        file = client.UpLoadFileInfo(file); //上传
                        //int percent = (int)((double)file.OffSet / (double)((long)file.Length)) * 100;
                        int percent = (int)(((double)file.OffSet / (double)((long)file.Length)) * 100);
                        (sender as BackgroundWorker).ReportProgress(percent);
                    }
                    // 移动文件到临时目录(此部分创建可以使用sqlserver数据库代替)
                    string address = string.Format(@"{0}\{1}", Helper.ServerFolderPath, file.Name);
                    //File.Create(address);
                    fileInfoIO.CopyTo(address, true);
                    LoadUpLoadFile();
                    e.Result = true;
                }

                // 启用上传按钮
                if (this.btnUpload.InvokeRequired)
                {
                    this.btnUpload.Invoke((ThreadStart)delegate
                    {
                        this.btnUpload.Enabled = true;
                    });
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                fs.Close();
                client.Close();
                client.Abort();
            }

public CustomFileInfo UpLoadFileInfo(CustomFileInfo fileInfo)
        {
            // 获取服务器文件上传路径
            string fileUpLoadPath = System.Web.Hosting.HostingEnvironment.MapPath("~/UpLoadFile/");
            // 如需指定新的文件夹,需要进行创建操作。
            Console.WriteLine("1");
            // 创建FileStream对象
            FileStream fs = new FileStream(fileUpLoadPath + fileInfo.Name, FileMode.OpenOrCreate);
            Console.WriteLine("2");

            long offSet = fileInfo.OffSet;
            // 使用提供的流创建BinaryWriter对象
            var binaryWriter = new BinaryWriter(fs, Encoding.UTF8);

            binaryWriter.Seek((int)offSet, SeekOrigin.Begin);
            binaryWriter.Write(fileInfo.SendByte);
            fileInfo.OffSet = fs.Length;
            fileInfo.SendByte = null;

            binaryWriter.Close();
            fs.Close();
            Console.WriteLine("2");
            return fileInfo;
        }
我使用的wcf上传文件。[/quote]
  • 打赏
  • 举报
回复
引用 7 楼 BitSoftStudio 的回复:
算,有合适的吗? [quote=引用 6 楼 duanzi_peng 的回复:] [quote=引用 4 楼 BitSoftStudio 的回复:] B/S结构不太合适。 有.net调用的C/S结构的源代码吗或实现方法吗?
cs可以向服务器上传2g的算吗??[/quote][/quote]

void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            // 要上传的文件地址
            FileStream fs = File.OpenRead(fileInfoIO.FullName);
            // 实例化服务客户的
            ServiceFileClient client = new ServiceFileClient();
            try
            {
                string path = e.Argument.ToString();
                int maxSiz = 1024 * 100;
                System.IO.FileInfo fileInfoIO = new System.IO.FileInfo(path);

                // 根据文件名获取服务器上的文件

                CustomFileInfo file = client.GetFileInfo(fileInfoIO.Name);

                if (file == null)
                {
                    file = new CustomFileInfo();
                    file.OffSet = 0;
                }
                file.Name = fileInfoIO.Name;
                file.Length = fs.Length;

                if (file.Length == file.OffSet) //如果文件的长度等于文件的偏移量,说明文件已经上传完成
                {
                    MessageBox.Show("该文件已存在");
                    e.Result = false;   // 设置异步操作结果为false
                }
                else
                {
                    while (file.Length != file.OffSet)
                    {
                        file.SendByte = new byte[file.Length - file.OffSet <= maxSiz ? file.Length - file.OffSet : maxSiz]; //设置传递的数据的大小

                        fs.Position = file.OffSet; //设置本地文件数据的读取位置
                        fs.Read(file.SendByte, 0, file.SendByte.Length);//把数据写入到file.Data中
                        file = client.UpLoadFileInfo(file); //上传
                        //int percent = (int)((double)file.OffSet / (double)((long)file.Length)) * 100;
                        int percent = (int)(((double)file.OffSet / (double)((long)file.Length)) * 100);
                        (sender as BackgroundWorker).ReportProgress(percent);
                    }
                    // 移动文件到临时目录(此部分创建可以使用sqlserver数据库代替)
                    string address = string.Format(@"{0}\{1}", Helper.ServerFolderPath, file.Name);
                    //File.Create(address);
                    fileInfoIO.CopyTo(address, true);
                    LoadUpLoadFile();
                    e.Result = true;
                }

                // 启用上传按钮
                if (this.btnUpload.InvokeRequired)
                {
                    this.btnUpload.Invoke((ThreadStart)delegate
                    {
                        this.btnUpload.Enabled = true;
                    });
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                fs.Close();
                client.Close();
                client.Abort();
            }

public CustomFileInfo UpLoadFileInfo(CustomFileInfo fileInfo)
        {
            // 获取服务器文件上传路径
            string fileUpLoadPath = System.Web.Hosting.HostingEnvironment.MapPath("~/UpLoadFile/");
            // 如需指定新的文件夹,需要进行创建操作。
            Console.WriteLine("1");
            // 创建FileStream对象
            FileStream fs = new FileStream(fileUpLoadPath + fileInfo.Name, FileMode.OpenOrCreate);
            Console.WriteLine("2");

            long offSet = fileInfo.OffSet;
            // 使用提供的流创建BinaryWriter对象
            var binaryWriter = new BinaryWriter(fs, Encoding.UTF8);

            binaryWriter.Seek((int)offSet, SeekOrigin.Begin);
            binaryWriter.Write(fileInfo.SendByte);
            fileInfo.OffSet = fs.Length;
            fileInfo.SendByte = null;

            binaryWriter.Close();
            fs.Close();
            Console.WriteLine("2");
            return fileInfo;
        }
我使用的wcf上传文件。
BitSoftStudio 2014-01-25
  • 打赏
  • 举报
回复
谢谢!不过FTP的速度好象快不起来
引用 5 楼 wind_cloud2011 的回复:
http://blog.csdn.net/hank212/article/details/6562918
BitSoftStudio 2014-01-25
  • 打赏
  • 举报
回复
算,有合适的吗?
引用 6 楼 duanzi_peng 的回复:
[quote=引用 4 楼 BitSoftStudio 的回复:] B/S结构不太合适。 有.net调用的C/S结构的源代码吗或实现方法吗?
cs可以向服务器上传2g的算吗??[/quote]
  • 打赏
  • 举报
回复
引用 4 楼 BitSoftStudio 的回复:
B/S结构不太合适。 有.net调用的C/S结构的源代码吗或实现方法吗?
cs可以向服务器上传2g的算吗??
BitSoftStudio 2014-01-25
  • 打赏
  • 举报
回复
谢谢。我的QQ邮箱:1272786581@qq.com
引用 11 楼 duanzi_peng 的回复:
[quote=引用 10 楼 BitSoftStudio 的回复:] 能把整体的源代码发给我参考一下吗? [quote=引用 9 楼 duanzi_peng 的回复:] [quote=引用 7 楼 BitSoftStudio 的回复:] 算,有合适的吗? [quote=引用 6 楼 duanzi_peng 的回复:] [quote=引用 4 楼 BitSoftStudio 的回复:] B/S结构不太合适。 有.net调用的C/S结构的源代码吗或实现方法吗?
cs可以向服务器上传2g的算吗??[/quote][/quote]

void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            // 要上传的文件地址
            FileStream fs = File.OpenRead(fileInfoIO.FullName);
            // 实例化服务客户的
            ServiceFileClient client = new ServiceFileClient();
            try
            {
                string path = e.Argument.ToString();
                int maxSiz = 1024 * 100;
                System.IO.FileInfo fileInfoIO = new System.IO.FileInfo(path);

                // 根据文件名获取服务器上的文件

                CustomFileInfo file = client.GetFileInfo(fileInfoIO.Name);

                if (file == null)
                {
                    file = new CustomFileInfo();
                    file.OffSet = 0;
                }
                file.Name = fileInfoIO.Name;
                file.Length = fs.Length;

                if (file.Length == file.OffSet) //如果文件的长度等于文件的偏移量,说明文件已经上传完成
                {
                    MessageBox.Show("该文件已存在");
                    e.Result = false;   // 设置异步操作结果为false
                }
                else
                {
                    while (file.Length != file.OffSet)
                    {
                        file.SendByte = new byte[file.Length - file.OffSet <= maxSiz ? file.Length - file.OffSet : maxSiz]; //设置传递的数据的大小

                        fs.Position = file.OffSet; //设置本地文件数据的读取位置
                        fs.Read(file.SendByte, 0, file.SendByte.Length);//把数据写入到file.Data中
                        file = client.UpLoadFileInfo(file); //上传
                        //int percent = (int)((double)file.OffSet / (double)((long)file.Length)) * 100;
                        int percent = (int)(((double)file.OffSet / (double)((long)file.Length)) * 100);
                        (sender as BackgroundWorker).ReportProgress(percent);
                    }
                    // 移动文件到临时目录(此部分创建可以使用sqlserver数据库代替)
                    string address = string.Format(@"{0}\{1}", Helper.ServerFolderPath, file.Name);
                    //File.Create(address);
                    fileInfoIO.CopyTo(address, true);
                    LoadUpLoadFile();
                    e.Result = true;
                }

                // 启用上传按钮
                if (this.btnUpload.InvokeRequired)
                {
                    this.btnUpload.Invoke((ThreadStart)delegate
                    {
                        this.btnUpload.Enabled = true;
                    });
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                fs.Close();
                client.Close();
                client.Abort();
            }

public CustomFileInfo UpLoadFileInfo(CustomFileInfo fileInfo)
        {
            // 获取服务器文件上传路径
            string fileUpLoadPath = System.Web.Hosting.HostingEnvironment.MapPath("~/UpLoadFile/");
            // 如需指定新的文件夹,需要进行创建操作。
            Console.WriteLine("1");
            // 创建FileStream对象
            FileStream fs = new FileStream(fileUpLoadPath + fileInfo.Name, FileMode.OpenOrCreate);
            Console.WriteLine("2");

            long offSet = fileInfo.OffSet;
            // 使用提供的流创建BinaryWriter对象
            var binaryWriter = new BinaryWriter(fs, Encoding.UTF8);

            binaryWriter.Seek((int)offSet, SeekOrigin.Begin);
            binaryWriter.Write(fileInfo.SendByte);
            fileInfo.OffSet = fs.Length;
            fileInfo.SendByte = null;

            binaryWriter.Close();
            fs.Close();
            Console.WriteLine("2");
            return fileInfo;
        }
我使用的wcf上传文件。[/quote][/quote] 发你qq邮箱里吧[/quote]
  • 打赏
  • 举报
回复
引用 10 楼 BitSoftStudio 的回复:
能把整体的源代码发给我参考一下吗? [quote=引用 9 楼 duanzi_peng 的回复:] [quote=引用 7 楼 BitSoftStudio 的回复:] 算,有合适的吗? [quote=引用 6 楼 duanzi_peng 的回复:] [quote=引用 4 楼 BitSoftStudio 的回复:] B/S结构不太合适。 有.net调用的C/S结构的源代码吗或实现方法吗?
cs可以向服务器上传2g的算吗??[/quote][/quote]

void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            // 要上传的文件地址
            FileStream fs = File.OpenRead(fileInfoIO.FullName);
            // 实例化服务客户的
            ServiceFileClient client = new ServiceFileClient();
            try
            {
                string path = e.Argument.ToString();
                int maxSiz = 1024 * 100;
                System.IO.FileInfo fileInfoIO = new System.IO.FileInfo(path);

                // 根据文件名获取服务器上的文件

                CustomFileInfo file = client.GetFileInfo(fileInfoIO.Name);

                if (file == null)
                {
                    file = new CustomFileInfo();
                    file.OffSet = 0;
                }
                file.Name = fileInfoIO.Name;
                file.Length = fs.Length;

                if (file.Length == file.OffSet) //如果文件的长度等于文件的偏移量,说明文件已经上传完成
                {
                    MessageBox.Show("该文件已存在");
                    e.Result = false;   // 设置异步操作结果为false
                }
                else
                {
                    while (file.Length != file.OffSet)
                    {
                        file.SendByte = new byte[file.Length - file.OffSet <= maxSiz ? file.Length - file.OffSet : maxSiz]; //设置传递的数据的大小

                        fs.Position = file.OffSet; //设置本地文件数据的读取位置
                        fs.Read(file.SendByte, 0, file.SendByte.Length);//把数据写入到file.Data中
                        file = client.UpLoadFileInfo(file); //上传
                        //int percent = (int)((double)file.OffSet / (double)((long)file.Length)) * 100;
                        int percent = (int)(((double)file.OffSet / (double)((long)file.Length)) * 100);
                        (sender as BackgroundWorker).ReportProgress(percent);
                    }
                    // 移动文件到临时目录(此部分创建可以使用sqlserver数据库代替)
                    string address = string.Format(@"{0}\{1}", Helper.ServerFolderPath, file.Name);
                    //File.Create(address);
                    fileInfoIO.CopyTo(address, true);
                    LoadUpLoadFile();
                    e.Result = true;
                }

                // 启用上传按钮
                if (this.btnUpload.InvokeRequired)
                {
                    this.btnUpload.Invoke((ThreadStart)delegate
                    {
                        this.btnUpload.Enabled = true;
                    });
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                fs.Close();
                client.Close();
                client.Abort();
            }

public CustomFileInfo UpLoadFileInfo(CustomFileInfo fileInfo)
        {
            // 获取服务器文件上传路径
            string fileUpLoadPath = System.Web.Hosting.HostingEnvironment.MapPath("~/UpLoadFile/");
            // 如需指定新的文件夹,需要进行创建操作。
            Console.WriteLine("1");
            // 创建FileStream对象
            FileStream fs = new FileStream(fileUpLoadPath + fileInfo.Name, FileMode.OpenOrCreate);
            Console.WriteLine("2");

            long offSet = fileInfo.OffSet;
            // 使用提供的流创建BinaryWriter对象
            var binaryWriter = new BinaryWriter(fs, Encoding.UTF8);

            binaryWriter.Seek((int)offSet, SeekOrigin.Begin);
            binaryWriter.Write(fileInfo.SendByte);
            fileInfo.OffSet = fs.Length;
            fileInfo.SendByte = null;

            binaryWriter.Close();
            fs.Close();
            Console.WriteLine("2");
            return fileInfo;
        }
我使用的wcf上传文件。[/quote][/quote] 发你qq邮箱里吧
wind_cloud2011 2014-01-24
  • 打赏
  • 举报
回复
http://blog.csdn.net/hank212/article/details/6562918
BitSoftStudio 2014-01-24
  • 打赏
  • 举报
回复
B/S结构不太合适。 有.net调用的C/S结构的源代码吗或实现方法吗?
gwl872034 2014-01-24
  • 打赏
  • 举报
回复
引用 1 楼 hluangtongi 的回复:
Xproer.HttpUploader5:http://www.cnblogs.com/xproer/archive/2012/10/26/2741264.html 此控件支持100G文件的断点续传操作,提供了完善的开发文档,支持文件MD5验证,支持文件批量上传。 支持浏览器:Internet Explorer 6,Internet Explorer 7,Internet Explorer 8,Internet Explorer 9 Maxthon(遨游)1.x,Maxthon(遨游)2.x,TT浏览器,QQ浏览器,360安全浏览器, Chrome(Google浏览器),Maxthon3.x,360极速浏览器6.x,Firefox 粘贴文件,简化选择文件操作: 文件MD5值计算进度: 文件MD5值计算完毕 服务器根据MD5检测是否存在相同文件 续传文件 从服务器加载文件列表 文件上传中 文件上传完毕 上传文件夹 与Discuz!X2整合-后台安装断点续传控件 与Discuz!X2整合-后台启用断点续传控件 与Discuz!X2整合-后台断点续传控件启用成功 与Discuz!X2整合-前台发帖页面 与Discuz!X2整合-上传 页面调用示例代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>HTTP断点续传控件与MySQL数据库演示页面(UTF-8)</title>
    <link href="HttpUploader/HttpUploader.css" type="text/css" rel="Stylesheet"/>
    <script type="text/javascript" charset="utf-8" src="HttpUploader/FileLister.js"></script>
    <script type="text/javascript" charset="utf-8" src="HttpUploader/HttpUploader.js"></script>
    <script type="text/javascript" charset="utf-8" src="HttpUploader/combinbox.js"></script>
    <script type="text/javascript" src="HttpUploader/jquery-1.3.2.min.js"></script>
    <script language="javascript" type="text/javascript">
    	var cbItemLast = null;
    	var cbMgr = new CombinBoxMgr();

    	$(document).ready(function()
    	{
    		cbMgr.LoadInControl("FilePanel");
    		cbMgr.Init();
    	});
    </script>
</head>
<body>
	<div id="FilePanel"></div>
</body>
</html>
这个不错。我们公司现在做的一个云存储项目就是用的这个控件。他们提供的开发文档比较详细,示例代码也比较规范,可以直接用在项目中,基本上不需要做什么改动。
Blue_MSN 2014-01-24
  • 打赏
  • 举报
回复
引用 楼主 BitSoftStudio 的回复:
最近的项目需要实现大文件的快速上传到服务器,支持多线程及断点续传。求源代码或思路。
大文件上传需要借助于控件来实现。你可以在网上搜一下HTTP断点续传控件,已经有成熟的产品了。
hluangtongi 2014-01-24
  • 打赏
  • 举报
回复
引用 楼主 BitSoftStudio 的回复:
最近的项目需要实现大文件的快速上传到服务器,支持多线程及断点续传。求源代码或思路。
网上有一个Web超大文件上传断点续传控件:http://www.cnblogs.com/xproer/archive/2012/10/26/2741264.html 此控件支持100G文件的断点续传操作,提供了完善的开发文档,支持文件MD5验证,支持文件批量上传。 支持浏览器:Internet Explorer 6,Internet Explorer 7,Internet Explorer 8,Internet Explorer 9 Maxthon(遨游)1.x,Maxthon(遨游)2.x,TT浏览器,QQ浏览器,360安全浏览器, Chrome(Google浏览器),Maxthon3.x,360极速浏览器6.x,Firefox 粘贴文件,简化选择文件操作: 文件MD5值计算进度: 文件MD5值计算完毕 服务器根据MD5检测是否存在相同文件 续传文件 从服务器加载文件列表 文件上传中 文件上传完毕 上传文件夹 与Discuz!X2整合-后台安装断点续传控件 与Discuz!X2整合-后台启用断点续传控件 与Discuz!X2整合-后台断点续传控件启用成功 与Discuz!X2整合-前台发帖页面 与Discuz!X2整合-上传 页面调用示例代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>HTTP断点续传控件与MySQL数据库演示页面(UTF-8)</title>
    <link href="HttpUploader/HttpUploader.css" type="text/css" rel="Stylesheet"/>
    <script type="text/javascript" charset="utf-8" src="HttpUploader/FileLister.js"></script>
    <script type="text/javascript" charset="utf-8" src="HttpUploader/HttpUploader.js"></script>
    <script type="text/javascript" charset="utf-8" src="HttpUploader/combinbox.js"></script>
    <script type="text/javascript" src="HttpUploader/jquery-1.3.2.min.js"></script>
    <script language="javascript" type="text/javascript">
    	var cbItemLast = null;
    	var cbMgr = new CombinBoxMgr();

    	$(document).ready(function()
    	{
    		cbMgr.LoadInControl("FilePanel");
    		cbMgr.Init();
    	});
    </script>
</head>
<body>
	<div id="FilePanel"></div>
</body>
</html>

111,094

社区成员

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

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

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