WCF+上传+大文件处理

大文件处理的方式拆分读取,此文只为记录文件处理方式,供日后查阅。

源码来自http://blog.csdn.net/lywust/article/details/7009248

经过改编将源码改编为文件上传的功能如下(处理几个GB的文件应该是没有问题的)

客户端

 1 public partial class WebForm1 : System.Web.UI.Page
 2     {
 3         protected void Page_Load(object sender, EventArgs e)
 4         {
 5 
 6         }
 7 
 8         protected void Button1_Click(object sender, EventArgs e)
 9         {
10             BigFileRead(@"E:\工具\开发工具\数据库\SqlServer\2008 r2\cn_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_522233.iso");
11             Response.Write("文件传输成功!");
12         }
13 
14         private void BigFileRead(string strFilePath)
15         {
16             UploadService c = new UploadService();
17             //每次读取的字节数
18             int iBufferSize = 1024000;
19             byte[] buffer = new byte[iBufferSize];
20             FileStream fs = null;
21             try
22             {
23                 fs = new FileStream(strFilePath, FileMode.Open);
24                 //文件流的长度
25                 long lFileSize = fs.Length;
26                 //文件需要读取次数
27                 int iTotalCount = (int)Math.Ceiling((double)(lFileSize / iBufferSize));
28                 //当前读取次数
29                 int iTempCount = 0;
30 
31                 while (iTempCount < iTotalCount)
32                 {
33                     //每次从最后读到的位置读取下一个[iBufferSize]的字节数
34                     fs.Read(buffer, 0, iBufferSize);
35                     ////将字节转换成字符
36                     //string strRead = Encoding.Default.GetString(buffer);
37                     ////此处加入你的处理逻辑
38                     //Console.Write(strRead);
39                     c.UploadFile("aaa.iso",buffer);
40                     iTempCount++;
41                 }
42 
43             }
44             catch (Exception ex)
45             {
46                 //异常处理
47             }
48             finally
49             {
50                 if (fs != null)
51                 {
52                     fs.Dispose();
53                 }
54             }
55         }
56     }
 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WcfService1.WebForm1" %>
 2 
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 4 
 5 <html xmlns="http://www.w3.org/1999/xhtml">
 6 <head runat="server">
 7     <title></title>
 8 </head>
 9 <body>
10     <form id="form1" runat="server">
11     <div>
12     
13         <asp:FileUpload ID="FileUpload1" runat="server" />
14         <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="上传" />
15     
16     </div>
17     </form>
18 </body>
19 </html>

 

配置文件(因在一个工程下所以包含服务端和客户端配置文件)

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3 
 4   <system.web>
 5     <compilation debug="true" targetFramework="4.0" />
 6       <httpRuntime   maxRequestLength="409600000" />
 7   </system.web>
 8     <system.serviceModel>
 9         <bindings>
10             <basicHttpBinding>
11                 <binding name="BasicHttpBinding_IUploadService" closeTimeout="00:01:00"
12                     openTimeout="00:01:00" receiveTimeout="01:10:00" sendTimeout="01:10:00"
13                     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
14                     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
15                     transferMode="Streamed"
16                     useDefaultWebProxy="true">
17                     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
18                         maxBytesPerRead="4096" maxNameTableCharCount="16384" />
19                     <security mode="None">
20                         <transport clientCredentialType="None" proxyCredentialType="None"
21                             realm="" />
22                         <message clientCredentialType="UserName" algorithmSuite="Default" />
23                     </security>
24                 </binding>
25             </basicHttpBinding>
26         </bindings>
27         <client>
28             <endpoint address="http://localhost:40121/mex" binding="basicHttpBinding"
29                 bindingConfiguration="BasicHttpBinding_IUploadService" contract="IUploadService"
30                 name="BasicHttpBinding_IUploadService" />
31         </client>
32     </system.serviceModel>
33  <system.webServer>
34     <modules runAllManagedModulesForAllRequests="true"/>
35   </system.webServer>
36   
37 </configuration>

服务端代码

 1 /// <summary>
 2     /// 
 3     /// </summary>
 4     [ServiceContract]
 5     public interface IUploadService
 6     {
 7         /// <summary>
 8         /// 
 9         /// </summary>
10         /// <param name="fileName"></param>
11         /// <param name="fileBuffer"></param>
12         [OperationContract]
13         void UploadFile(string fileName, byte[] fileBuffer);
14     }
 1     /// <summary>
 2     /// 
 3     /// </summary>
 4     public class UploadService : IUploadService
 5     {
 6         /// <summary>
 7         /// 
 8         /// </summary>
 9         /// <param name="fileName">文件名</param>
10         /// <param name="fileBuffer">文件流字节</param>
11         public void UploadFile(string fileName,byte[] fileBuffer)
12         {
13             FileStream fs = new FileStream("D:\\" + fileName, FileMode.OpenOrCreate);
14             BinaryWriter writer = new BinaryWriter(fs);
15             try
16             {
17                 long offset = fs.Length;
18                 writer.Seek((int)offset, SeekOrigin.End);
19                 writer.Write(fileBuffer);
20             }
21             catch (Exception e)
22             {
23             }
24             finally
25             {
26                 writer.Close();
27                 writer.Dispose();
28                 fs.Close();
29             }
30         }
31     }

 

代码下载 大文件处理[上传].rar

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。