zoukankan      html  css  js  c++  java
  • 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);
                }
            }
    

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

  • 相关阅读:
    node.js抓取数据(fake小爬虫)
    认识mongoDB数据库
    node.js基础:数据存储
    mysql语句在node.js中的写法
    node.js基础:HTTP服务器
    node.js基础:模块的创建和引入
    认识node.js:express(一)
    认识Require
    认识Backbone (五)
    认识Backbone (四)
  • 原文地址:https://www.cnblogs.com/yt-007/p/5177711.html
Copyright © 2011-2022 走看看