分享
 
 
 

通过Web Services上传和下载文件

王朝c#·作者佚名  2006-12-17
窄屏简体版  字體: |||超大  

随着Internet技术的发展和跨平台需求的日益增加,Web Services的应用越来越广,我们不但需要通过Web Services传递字符串信息,而且需要传递二进制文件信息。下面,我就分别介绍如何通过Web Services从服务器下载文件到客户端和从客户端通过Web Services上载文件到服务器。

一:通过Web Services显示和下载文件

我们这里建立的Web Services的名称为GetBinaryFile,提供两个公共方法:分别是GetImage()和GetImageType(),前者返回二进制文件字节数组,后者返回文件类型,其中,GetImage()方法有一个参数,用来在客户端选择要显示或下载的文件名字。这里我们所显示和下载的文件可以不在虚拟目录下,采用这个方法的好处是:可以根据权限对文件进行显示和下载控制,从下面的方法我们可以看出,实际的文件位置并没有在虚拟目录下,因此可以更好地对文件进行权限控制,这在对安全性有比较高的情况下特别有用。这个功能在以前的ASP程序中可以用Stream对象实现。为了方便读者进行测试,这里列出了全部的源代码,并在源代码里进行介绍和注释。

/// <summary>

/// Web 服务提供的方法,返回给定文件的字节数组。

/// </summary>

[WebMethod(Description="Web 服务提供的方法,返回给定文件的字节数组")]

public byte[] GetImage(string requestFileName)

{

///得到服务器端的一个图片

///如果你自己测试,注意修改下面的实际物理路径

if(requestFileName == null || requestFileName == "")

return getBinaryFile("E:\\getpic\\xp.JPG");

else

return getBinaryFile("E:\\getpic\\" + requestFileName);

}

/// <summary>

/// getBinaryFile:返回所给文件路径的字节数组。

/// </summary>

/// <param name="filename"></param>

/// <returns></returns>

public byte[] getBinaryFile(string filename)

{

if(File.Exists(filename))

{

try

{

///打开现有文件以进行读取。

FileStream s = File.OpenRead(filename);

return ConvertStreamToByteBuffer(s);

}

catch(Exception e)

{

return new byte[0];

}

}

else

{

return new byte[0];

}

}

/// <summary>

/// ConvertStreamToByteBuffer:把给定的文件流转换为二进制字节数组。

/// </summary>

/// <param name="theStream"></param>

/// <returns></returns>

public byte[] ConvertStreamToByteBuffer(System.IO.Stream theStream)

{

int b1;

System.IO.MemoryStream tempStream = new System.IO.MemoryStream();

while((b1=theStream.ReadByte())!=-1)

{

tempStream.WriteByte(((byte)b1));

}

return tempStream.ToArray();

}

[WebMethod(Description="Web 服务提供的方法,返回给定文件类型。")]

public string GetImageType()

{

///这里只是测试,您可以根据实际的文件类型进行动态输出

return "image/jpg";

}

[WebMethod(Description = "Web 服务提供的方法,返回是否文件上载成功与否。")]

public string UploadFile(byte[] fs, string FileName)

{

try

{

///定义并实例化一个内存流,以存放提交上来的字节数组。

MemoryStream m = new MemoryStream(fs);

///定义实际文件对象,保存上载的文件。

FileStream f = new FileStream(Server.MapPath(".") + "\\"

+ FileName, FileMode.Create);

///把内内存里的数据写入物理文件

m.WriteTo(f);

Bitmap bm = null;

bm = new Bitmap(f);

bm.Save(Server.MapPath(".") + "\\"

+ FileName+".JPEG");

m.Close();

f.Close();

f = null;

m = null;

return "文件已经上传成功。";

}

catch (Exception ex)

{

return ex.Message;

}

}

}

客户端代码片段:

private void button1_Click(object sender, EventArgs e)

{

pic.Service p = new getanddownpic.pic.Service();

///定义并初始化文件对象;

///得到二进制文件字节数组;

byte[] image = p.GetImage("");

///转换为支持存储区为内存的流

System.IO.MemoryStream memStream = new System.IO.MemoryStream(image);

///定义并实例化Bitmap对象

Bitmap bm = new Bitmap(memStream);

///根据不同的条件进行输出或者下载;

this.pictureBox1.Image = bm;

}

private void button2_Click(object sender, EventArgs e)

{

openFileDialog1.InitialDirectory = "C:/";

openFileDialog1.Filter = "All Files|*.*|Bitmaps|*.bmp|GIFs|*.gif|JPEGs|*.jpg";

openFileDialog1.FilterIndex = 2;

if (openFileDialog1.ShowDialog() == DialogResult.OK)

{

pictureBox1.Image = Image.FromFile(openFileDialog1.FileName);

pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;

pictureBox1.BorderStyle = BorderStyle.Fixed3D;

}

}

private void button3_Click(object sender, EventArgs e)

{

Bitmap bm = (Bitmap)this.pictureBox1.Image;

System.IO.MemoryStream memStream = new System.IO.MemoryStream();

if (this.textBox1.Text != null)

{

try

{

bm.Save(memStream, System.Drawing.Imaging.ImageFormat.Jpeg);

int size = (int)memStream.Length;

///处理上载的文件流信息。

byte[] b = new byte[size];

b = memStream.GetBuffer();

memStream.Close();

pic.Service up = new getanddownpic.pic.Service();

string r = up.UploadFile(b, this.textBox1.Text);

MessageBox.Show(r);

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

}

else

{

MessageBox.Show("please input a file name");

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有