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);
            }
        }

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

原文地址:https://www.cnblogs.com/yt-007/p/5177711.html