开始想直接写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
}
/// <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
try21
{ 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
finally29
{30
fs.Close(); 31
}32
}33
else34
{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![]()
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
try18
{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
else36
{37
bComplete = true;38
break;39
}40
}41
finally42
{43
fs.Close();44
}45

46
System.TimeSpan time1 = DateTime.Now - time;47
this.Text = time1.ToString();48
}49

50
51
}52



浙公网安备 33010602011771号