你的位置:首页 > ASP.net教程

[ASP.net教程]wcf rest 服务用于安卓和ISO调用4


很多时候,在上传文件的时候会保存文件的信息以及一些其他的信息.现在我们就上传一个用户,并上传文件.把需要上传的数据写到流里面.

服务端解析流,取出我们需要的数据.流的的组成如下图:

现在开始修改我们的upload方法.方法很简单,就是依次从流里面读我们需要的数据来进行保存.

 public bool UpLoad(Stream stream)    {      try      {        var modelStr = GetAnalysisResult(stream);        //序列化json字符串为model        var model = JsonConvert.DeserializeObject<Users>(modelStr);        //保存文件        var fileList = WriteFile(stream);        //保存model........        return true;      }      catch (Exception ex)      {        LogHelper.Error("保存文件失败", ex);        return false;      }    }

  提供了大概的代码.还有一些其他的方法.

 private void WriteFile(Stream stream, string fileName, int fileCount)    {              if (!Directory.Exists(FileUrl))          Directory.CreateDirectory(FileUrl); //新建文件夹        using (var fs = new FileStream(FileUrl + fileName, FileMode.Create, FileAccess.Write)) //保存文件        {          var buffer = getBytes(stream, fileCount);          fs.Write(buffer, 0, buffer.Length);          fs.Flush();        }         }    private byte[] getBytes(Stream stream, int count)    {      var buffer = new byte[count];      stream.Read(buffer, 0, count);      return buffer;    }    private string GetAnalysisResult(Stream stream)    {      var bytes = getBytes(stream, 4);      var desLength = BitConverter.ToInt32(bytes, 0); //json字符串长度      var desModelStr = Encoding.UTF8.GetString(getBytes(stream, desLength)); //json字符串      return desModelStr;    }    private ICollection<MFileInfo> WriteFile(Stream stream)    {      ICollection<MFileInfo> fileCollection = new List<MFileInfo>(); //用于存放文件信息      while (true)      {        var fileDesLength = BitConverter.ToInt32(getBytes(stream, 4), 0); //获取文件描述信息长度        if (fileDesLength == 0)        {          break;        }        var fileDesModelStr = Encoding.UTF8.GetString(getBytes(stream, fileDesLength)); //获取文件描述信息        var fileInfo = fileDesModelStr.Split('|'); //拆分文件信息        var fileSuffix = fileInfo[0].Substring(fileInfo[0].LastIndexOf('.')); //文件后缀名        var fileName = Guid.NewGuid().ToString().Replace("-", "") + fileSuffix; //重新生成文件名称        var fileCount = Convert.ToInt32(fileInfo[1]); //文件大小        var fileType = Convert.ToInt32(fileInfo[2]); //文件类型(1:图片2:视频)        WriteFile(stream, fileName, fileCount); //保存文件        fileCollection.Add(new MFileInfo        {          FileName = fileName,          Length = fileCount,          Type = fileType,          FileSuffix = fileSuffix        });      }      return fileCollection;    }

  如果有多个文件就利用循环依次读取.没有的时候就退出循环.借口的代码就写完了.接下来我们看看客户端代码.

  public static async void UploadFile2()    {      Stopwatch stopwatch = new Stopwatch();      var jobj = new JObject();      jobj["Id"] = "4";      jobj["Name"] = "大师兄";      jobj["Gender"] = 1;      string modelStr = jobj.ToString();      Console.WriteLine("请输入上传文件路径:");      string filePath = Console.ReadLine();      stopwatch.Start();      if (!string.IsNullOrEmpty(filePath) && File.Exists(filePath))      {        string fileName = filePath.Substring(filePath.LastIndexOf("\\", StringComparison.Ordinal) + 1);        FileStream fs = new FileStream(filePath, FileMode.Open);        byte[] buffer = new byte[fs.Length];        fs.Read(buffer, 0, buffer.Length);        string fileDes = fileName + "|" + fs.Length + "|" + 1;        var fileDesB = Encoding.UTF8.GetBytes(fileDes);        byte[] fileDesBytes = BitConverter.GetBytes(fileDesB.Length);        var desStr = Encoding.UTF8.GetBytes(modelStr);        byte[] desBytes = BitConverter.GetBytes(desStr.Length);        string url = "http://localhost:31572/Service1.svc/UpLoad";        WebRequest wRequest = WebRequest.Create(url);        wRequest.Proxy = null;        wRequest.Method = "POST";        wRequest.Timeout = 10000 * 100;        wRequest.CachePolicy = null;        var requestStream = wRequest.GetRequestStream();        await requestStream.WriteAsync(desBytes, 0, desBytes.Length);        await requestStream.WriteAsync(desStr, 0, desStr.Length);        await requestStream.WriteAsync(fileDesBytes, 0, fileDesBytes.Length);        await requestStream.WriteAsync(fileDesB, 0, fileDesB.Length);        await requestStream.WriteAsync(buffer, 0, buffer.Length);        var response = await wRequest.GetResponseAsync();        Stream stream1 = response.GetResponseStream();        StreamReader reader = new StreamReader(stream1, Encoding.Default);        string r = reader.ReadToEnd();  //url返回的值         stream1.Close();        response.Close();        stopwatch.Stop();        Console.WriteLine("文件上传:{0}", r);        Console.WriteLine("文件上传时间:{0}", stopwatch.ElapsedMilliseconds);      }    }

  文件上传到这里就结束了..........下一篇记录一下简单的身份验证