转自 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

4

5

6

7

8

9

10



11

12

13

14

15

16

17

18

19



20

21



22

23

24

25

26

27

28

29



30

31

32

33

34



35

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

4

5

6

7

8

9

10

11

12

13

14

15



16

17

18



19

20

21



22

23

24

25

26



27

28

29

30

31

32

33

34

35

36



37

38

39

40

41

42



43

44

45

46

47

48

49

50

51

52
