C# 关于文件上传服务器的几种方式讨论

时间:2021-01-05 04:01:02
第一种:通过FTP来上传文件

首先,在另外一台服务器上设置好FTP服务,并创建好允许上传的用户和密码,然后,在ASP.NET里就可以直接将文件上传到这台 FTP 服务器上了。

第二种:通过WebClient来上传文件

如:现在的开发的web应用程序的虚拟目录是WebAA,另一个应用程序的虚拟目录是WebBB,现在要从WebAA向WebBB下的一个UpLoadFiles文件夹下保存图片

第三种:通过Web Service来上传文件

 //上传文件至WebService所在服务器的方法,这里为了操作方法,文件都保存在UpDownFile服务所在文件夹下的File目录中
        [WebMethod]
        public bool Up(byte[] data, string filename)
        {
            try
            {
                FileStream fs = File.Create(Server.MapPath("File/") + filename);
                fs.Write(data, 0, data.Length);
                fs.Close();
                return true;
            }
            catch
            {
                return false;
            }
        }


想知道上面几种方式的优劣,或者谁那边有好的高性能文件上传的源码提供,不胜感激

10 个解决方案

#1


ftp需要另外部署ftp 服务器,第二个办法通用性最好,第三个办法需要服务器支持

#2


webclient要在web服务器进行配置,比如设置允许put动作和设置权限等。另外,web service如果要实现复杂的上传功能,比如断点续传需要自行实现,但ftp自带命令。

所以结论是:如果要实现简单的文件上传,优先使用方法3,如果要实现复杂的文件上传功能,优先使用方法1. 总的评价是:1>3>2.

#3


ftp 超级慢、卡、不稳定。使用比较直接的 http 方式即可。

至于说有没有必要将 byte[ ] 用 WCF 服务封装,这个也许算是个人爱好了。就好象有的人喜欢在大夏天还穿冬天的衣服鞋子一样。反正我是整个WCF都弃用的,WCF最初的目标是为了封装复杂的RPC调用,微软虽然被轻量化的 http 调用风格逼着把 WCF 做了许多次简化重新包装,但是它对我来说其实还是夏天穿翻毛皮鞋似地。但是对于初学者,以入门教程为基准,觉得WCF更符合教程上的说法,这是可以理解的。

#4


我以前回复过的例子: http://bbs.csdn.net/topics/391031875

抄代码其实就不在同一个角度讨论问题了,我们应该看到背后的实质。WCF是对“服务”的上传下载数据格式、客户端代理机制、服务器的服务程序注册和发现机制进行了封装。而这种代价,其实对于我这样更愿意用最近5年的潮流来设计web端的人看来,WCF通常是不在第一时间考虑的。第一时间你只要支持一个所有的通用 web 客户端(包括浏览器上的 js 程序,jQuery.ajax 方法等等)支持的精简的 http post/get 数据服务功能即可。

#5


另外我在上面的例子中,可能主要是为了回答那个帖子的问题,所以例子中的功能是以“字符串”为目标的。

而假设要上传一个 byte[ ],那么显然只要写
byte[] data = .......;
var data = new WebClient().UploadData("http://localhost:2171/TestWebClientUpload2.ashx?filename" + urlencodeFileName +"&position"+ position, data); 

那么你的服务器端直接从 Request.InputStream 中读取 data,然后保存到相应文件的 position 偏移位置。代码跟上传一个字符串类似。

#6


第2种方法我没用过,学习了。
就我自己的经验,1,3都可行,ftp服务架设我用filezilla server比较多一些。

ftp可以以二进制字节形式传输,webservice是http传输,这种写法一般也是把字节数组base64编码后再传,体积略大于原始字节数组的。大的文件,传输效率上,是低于ftp的。

#7


引用 6 楼 txfast 的回复:
这种写法一般也是把字节数组base64编码后再传,体积略大于原始字节数组的。


http 消息体是二进制数据。假设你把二进制刻意地当作string来传送,才需要base64编码。普通的 http post 传送数据是不需要考虑编码的,所 post data 本身就是byte [ ]。

#8


引用 楼主 dragon_ton 的回复:
第一种:通过FTP来上传文件

首先,在另外一台服务器上设置好FTP服务,并创建好允许上传的用户和密码,然后,在ASP.NET里就可以直接将文件上传到这台 FTP 服务器上了。

第二种:通过WebClient来上传文件

如:现在的开发的web应用程序的虚拟目录是WebAA,另一个应用程序的虚拟目录是WebBB,现在要从WebAA向WebBB下的一个UpLoadFiles文件夹下保存图片

第三种:通过Web Service来上传文件

 //上传文件至WebService所在服务器的方法,这里为了操作方法,文件都保存在UpDownFile服务所在文件夹下的File目录中
        [WebMethod]
        public bool Up(byte[] data, string filename)
        {
            try
            {
                FileStream fs = File.Create(Server.MapPath("File/") + filename);
                fs.Write(data, 0, data.Length);
                fs.Close();
                return true;
            }
            catch
            {
                return false;
            }
        }


想知道上面几种方式的优劣,或者谁那边有好的高性能文件上传的源码提供,不胜感激


还可以用html5的 Web Socket api传输文件,不过要浏览器支持,直接用js来传输文件。

#10


webapi,建立一个服务接口,看看微信,云空间,怎么不让你用FTP上传的?

#1


ftp需要另外部署ftp 服务器,第二个办法通用性最好,第三个办法需要服务器支持

#2


webclient要在web服务器进行配置,比如设置允许put动作和设置权限等。另外,web service如果要实现复杂的上传功能,比如断点续传需要自行实现,但ftp自带命令。

所以结论是:如果要实现简单的文件上传,优先使用方法3,如果要实现复杂的文件上传功能,优先使用方法1. 总的评价是:1>3>2.

#3


ftp 超级慢、卡、不稳定。使用比较直接的 http 方式即可。

至于说有没有必要将 byte[ ] 用 WCF 服务封装,这个也许算是个人爱好了。就好象有的人喜欢在大夏天还穿冬天的衣服鞋子一样。反正我是整个WCF都弃用的,WCF最初的目标是为了封装复杂的RPC调用,微软虽然被轻量化的 http 调用风格逼着把 WCF 做了许多次简化重新包装,但是它对我来说其实还是夏天穿翻毛皮鞋似地。但是对于初学者,以入门教程为基准,觉得WCF更符合教程上的说法,这是可以理解的。

#4


我以前回复过的例子: http://bbs.csdn.net/topics/391031875

抄代码其实就不在同一个角度讨论问题了,我们应该看到背后的实质。WCF是对“服务”的上传下载数据格式、客户端代理机制、服务器的服务程序注册和发现机制进行了封装。而这种代价,其实对于我这样更愿意用最近5年的潮流来设计web端的人看来,WCF通常是不在第一时间考虑的。第一时间你只要支持一个所有的通用 web 客户端(包括浏览器上的 js 程序,jQuery.ajax 方法等等)支持的精简的 http post/get 数据服务功能即可。

#5


另外我在上面的例子中,可能主要是为了回答那个帖子的问题,所以例子中的功能是以“字符串”为目标的。

而假设要上传一个 byte[ ],那么显然只要写
byte[] data = .......;
var data = new WebClient().UploadData("http://localhost:2171/TestWebClientUpload2.ashx?filename" + urlencodeFileName +"&position"+ position, data); 

那么你的服务器端直接从 Request.InputStream 中读取 data,然后保存到相应文件的 position 偏移位置。代码跟上传一个字符串类似。

#6


第2种方法我没用过,学习了。
就我自己的经验,1,3都可行,ftp服务架设我用filezilla server比较多一些。

ftp可以以二进制字节形式传输,webservice是http传输,这种写法一般也是把字节数组base64编码后再传,体积略大于原始字节数组的。大的文件,传输效率上,是低于ftp的。

#7


引用 6 楼 txfast 的回复:
这种写法一般也是把字节数组base64编码后再传,体积略大于原始字节数组的。


http 消息体是二进制数据。假设你把二进制刻意地当作string来传送,才需要base64编码。普通的 http post 传送数据是不需要考虑编码的,所 post data 本身就是byte [ ]。

#8


引用 楼主 dragon_ton 的回复:
第一种:通过FTP来上传文件

首先,在另外一台服务器上设置好FTP服务,并创建好允许上传的用户和密码,然后,在ASP.NET里就可以直接将文件上传到这台 FTP 服务器上了。

第二种:通过WebClient来上传文件

如:现在的开发的web应用程序的虚拟目录是WebAA,另一个应用程序的虚拟目录是WebBB,现在要从WebAA向WebBB下的一个UpLoadFiles文件夹下保存图片

第三种:通过Web Service来上传文件

 //上传文件至WebService所在服务器的方法,这里为了操作方法,文件都保存在UpDownFile服务所在文件夹下的File目录中
        [WebMethod]
        public bool Up(byte[] data, string filename)
        {
            try
            {
                FileStream fs = File.Create(Server.MapPath("File/") + filename);
                fs.Write(data, 0, data.Length);
                fs.Close();
                return true;
            }
            catch
            {
                return false;
            }
        }


想知道上面几种方式的优劣,或者谁那边有好的高性能文件上传的源码提供,不胜感激


还可以用html5的 Web Socket api传输文件,不过要浏览器支持,直接用js来传输文件。

#9


#10


webapi,建立一个服务接口,看看微信,云空间,怎么不让你用FTP上传的?