转自 http://calmzeal.cnblogs.com/archive/2006/01/05/311422.html
开始想直接写dimeStream没有成功
改用MemoryStream再用dimeAttach的Stream构造函数
必须要将Stream Seek 到SeekOrigin.Begin才能成功
1
/**/
/// <summary>
2 /// 分块下载附件
3 /// </summary>
4 /// <param name="sFileName">文件名</param>
5 /// <param name="offset">文件起始偏移量</param>
6 /// <param name="size">一次读取大小</param>
7 /// <returns>返回附件文件大小</returns>
8 [WebMethod]
9 public int GetPartitionAttachment( string sFileName, int offset, int size)
10 {
11 string[] names = sFileName.Split("//".ToCharArray());
12 string filename=Server.MapPath(names[names.Length - 1]);
13
14 byte[] buffer = new byte[size];
15 FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read,FileShare.Read);
16 fs.Seek(offset,SeekOrigin.Begin);
17 int numBytes;
18 if((numBytes = fs.Read(buffer,0,size)) > 0)
19 {
20 try
21 {
22 MemoryStream ms = new MemoryStream(buffer,0,size);
23 ms.Seek(0,SeekOrigin.Begin);
24
25 ResponseSoapContext.Current.Attachments.Add(new dime.DimeAttachment("File","image/jpeg",dime.TypeFormat.MediaType,ms));
26 return numBytes;
27 }
28 finally
29 {
30 fs.Close();
31 }
32 }
33 else
34 {
35 return 0;
36 }
37
38 }
2 /// 分块下载附件
3 /// </summary>
4 /// <param name="sFileName">文件名</param>
5 /// <param name="offset">文件起始偏移量</param>
6 /// <param name="size">一次读取大小</param>
7 /// <returns>返回附件文件大小</returns>
8 [WebMethod]
9 public int GetPartitionAttachment( string sFileName, int offset, int size)
10 {
11 string[] names = sFileName.Split("//".ToCharArray());
12 string filename=Server.MapPath(names[names.Length - 1]);
13
14 byte[] buffer = new byte[size];
15 FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read,FileShare.Read);
16 fs.Seek(offset,SeekOrigin.Begin);
17 int numBytes;
18 if((numBytes = fs.Read(buffer,0,size)) > 0)
19 {
20 try
21 {
22 MemoryStream ms = new MemoryStream(buffer,0,size);
23 ms.Seek(0,SeekOrigin.Begin);
24
25 ResponseSoapContext.Current.Attachments.Add(new dime.DimeAttachment("File","image/jpeg",dime.TypeFormat.MediaType,ms));
26 return numBytes;
27 }
28 finally
29 {
30 fs.Close();
31 }
32 }
33 else
34 {
35 return 0;
36 }
37
38 }
客户端代码示例:
1
private
void
button2_Click(
object
sender, System.EventArgs e)
2 {
3 int offset = 0;
4 int buffersize = 3* 1024*1024;
5 bool bComplete = false;
6 FileStream fs = null;
7 string sFileName = textBox1.Text;
8 Adb.AdvWse adv = new TestWebSrv.Adb.AdvWse();
9 byte[] buffer = new byte[buffersize];
10 int size = 0;
11 int result = 0;
12 System.DateTime time = DateTime.Now;
13
14 while( !bComplete )
15 {
16 Application.DoEvents();
17 try
18 {
19 result = adv.GetPartitionAttachment(sFileName,offset,buffersize);
20 if (result == 0)
21 {
22 bComplete = true;
23 break;
24 }
25 if (adv.ResponseSoapContext.Attachments.Count != 0)
26 {
27 fs = new System.IO.FileStream(sFileName,FileMode.OpenOrCreate,FileAccess.Write);
28 fs.Seek(0,SeekOrigin.End);
29 size = adv.ResponseSoapContext.Attachments[0].Stream.Read(buffer,0,buffersize);
30 fs.Write(buffer,0,result);
31 offset += result;
32 textBox2.Text = offset.ToString()+"Bytes Received/r/n" + textBox2.Text;
33 Application.DoEvents();
34 }
35 else
36 {
37 bComplete = true;
38 break;
39 }
40 }
41 finally
42 {
43 fs.Close();
44 }
45
46 System.TimeSpan time1 = DateTime.Now - time;
47 this.Text = time1.ToString();
48 }
49
50
51 }
52
2 {
3 int offset = 0;
4 int buffersize = 3* 1024*1024;
5 bool bComplete = false;
6 FileStream fs = null;
7 string sFileName = textBox1.Text;
8 Adb.AdvWse adv = new TestWebSrv.Adb.AdvWse();
9 byte[] buffer = new byte[buffersize];
10 int size = 0;
11 int result = 0;
12 System.DateTime time = DateTime.Now;
13
14 while( !bComplete )
15 {
16 Application.DoEvents();
17 try
18 {
19 result = adv.GetPartitionAttachment(sFileName,offset,buffersize);
20 if (result == 0)
21 {
22 bComplete = true;
23 break;
24 }
25 if (adv.ResponseSoapContext.Attachments.Count != 0)
26 {
27 fs = new System.IO.FileStream(sFileName,FileMode.OpenOrCreate,FileAccess.Write);
28 fs.Seek(0,SeekOrigin.End);
29 size = adv.ResponseSoapContext.Attachments[0].Stream.Read(buffer,0,buffersize);
30 fs.Write(buffer,0,result);
31 offset += result;
32 textBox2.Text = offset.ToString()+"Bytes Received/r/n" + textBox2.Text;
33 Application.DoEvents();
34 }
35 else
36 {
37 bComplete = true;
38 break;
39 }
40 }
41 finally
42 {
43 fs.Close();
44 }
45
46 System.TimeSpan time1 = DateTime.Now - time;
47 this.Text = time1.ToString();
48 }
49
50
51 }
52