using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; using System.IO; using System.Configuration; namespace UpDownFile { /// <summary> /// UpDownService 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 // [System.Web.Script.Services.ScriptService] public class UpDownService : System.Web.Services.WebService { string keyvalue = ConfigurationManager.AppSettings["SecurityKey"]; public SecurityHeader securityKey = new SecurityHeader(); //将Stream流转换为byte数组的方法。 //PS:原本想把这个方法也当做WebMethod的,因为客户端在上传文件时也要调用该方法,后来发现Stream类型的不能通过WebService传输。。。:( public byte[] ConvertStreamToByteBuffer(Stream s) { MemoryStream ms = new MemoryStream(); int b; while ((b = s.ReadByte()) != -1) { ms.WriteByte((byte)b); } return ms.ToArray(); } //上传文件至WebService所在服务器的方法,这里为了操作方法,文件都保存在UpDownFile服务所在文件夹下的File目录中 [WebMethod] [SoapHeader("securityKey")] public bool Up(byte[] data, string filename) { if (securityKey.SecurityKey.Equals(keyvalue)) { try { if (!Directory.Exists(Server.MapPath("Images/") + filename.Substring(0, filename.LastIndexOf('\\')))) { Directory.CreateDirectory(Server.MapPath("Images/") + filename.Substring(0, filename.LastIndexOf('\\'))); } FileStream fs = File.Create(Server.MapPath("Images/") + filename); fs.Write(data, 0, data.Length); fs.Close(); return true; } catch { return false; } } else { return false; } } //下载WebService所在服务器上的文件的方法 [WebMethod] [SoapHeader("securityKey")] public byte[] Down(string filename) { if (securityKey.SecurityKey.Equals(keyvalue)) { string filepath = Server.MapPath("Images/") + filename; if (File.Exists(filepath)) { try { FileStream s = File.OpenRead(filepath); return ConvertStreamToByteBuffer(s); } catch { return new byte[0]; } } else { return new byte[0]; } } else { return new byte[0]; } } } }