コード例 #1
0
        private void txtImage_Click(object sender, EventArgs e)
        {
            var ofd = new OpenFileDialog();

            ofd.Filter = "Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png";

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                var fileName    = ofd.SafeFileName.Insert(ofd.SafeFileName.IndexOf("."), DateTime.Now.ToString("yyyymmddffff"));
                var buffer      = File.ReadAllBytes(ofd.FileName);
                var fileNameURL = _fileServiceClient.UploadFile(new Logic.Entities.ImageData()
                {
                    FileName = fileName, FileData = buffer
                });
                var buttonEdit = sender as ButtonEdit;
                buttonEdit.EditValue = fileNameURL;
            }
        }
コード例 #2
0
        /// <summary>
        /// 文件上传
        /// </summary>
        /// <param name="filesPath">文件路径</param>
        /// <param name="mark">标记</param>
        /// <param name="cancellationToken">异步取消命令</param>
        /// <returns>下载任务(是否成功、原因、成功的文件名)</returns>
        public static async Task <TransferResult <List <string> > > FileUpload(FileService.FileServiceClient client, List <string> filesPath, string mark, System.Threading.CancellationToken cancellationToken = new System.Threading.CancellationToken())
        {
            var result = new TransferResult <List <string> > {
                Message = "没有文件需要下载"
            };

            if (filesPath.Count == 0)
            {
                return(result);
            }
            result.Message = "未能连接到服务器";
            var lstSuccFiles = new List <string>();//传输成功的文件
            int chunkSize    = 1024 * 1024;

            byte[]     buffer    = new byte[chunkSize]; //每次发送的大小
            FileStream fs        = null;                //文件流
            DateTime   startTime = DateTime.Now;

            try
            {
                using (var stream = client.UploadFile())//连接上传文件的客户端
                {
                    //reply.Block数字的含义是服务器和客户端约定的
                    foreach (var filePath in filesPath)
                    {
                        if (cancellationToken.IsCancellationRequested)
                        {
                            break;//取消了传输
                        }
                        FileReply reply = new FileReply()
                        {
                            FileName = Path.GetFileName(filePath),
                            Mark     = mark
                        };
                        if (!File.Exists(filePath))
                        {
                            Console.WriteLine($"文件不存在:{filePath}");
                            continue;
                        }
                        fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, chunkSize, useAsync: true);
                        int readTimes = 0;
                        while (true)
                        {
                            if (cancellationToken.IsCancellationRequested)
                            {
                                reply.Block   = -1;                           //取消了传输
                                reply.Content = Google.Protobuf.ByteString.Empty;
                                await stream.RequestStream.WriteAsync(reply); //发送取消传输的命令

                                break;                                        //取消了传输
                            }
                            int readSize = fs.Read(buffer, 0, buffer.Length);
                            if (readSize > 0)
                            {
                                reply.Block   = ++readTimes;//更新标记,发送数据
                                reply.Content = Google.Protobuf.ByteString.CopyFrom(buffer, 0, readSize);
                                await stream.RequestStream.WriteAsync(reply);
                            }
                            else
                            {
                                Console.WriteLine($"完成文件【{filePath}】的上传。");
                                reply.Block   = 0;                            //文件发送结束的标记
                                reply.Content = Google.Protobuf.ByteString.Empty;
                                await stream.RequestStream.WriteAsync(reply); //发送结束标记

                                //等待服务器回传
                                await stream.ResponseStream.MoveNext(cancellationToken);

                                if (stream.ResponseStream.Current != null && stream.ResponseStream.Current.Mark == mark)
                                {
                                    lstSuccFiles.Add(filePath); //记录成功的文件
                                }
                                break;                          //发送下一个文件
                            }
                        }
                        fs?.Close();
                    }
                    if (cancellationToken.IsCancellationRequested)
                    {
                        fs?.Close();//释放文件流
                        result.IsSuccess = false;
                        result.Message   = $"用户取消了上传文件。已完成【{lstSuccFiles.Count}/{filesPath.Count}】,耗时:{DateTime.Now - startTime}";
                    }
                    else
                    {
                        result.IsSuccess = true;
                        result.Message   = $"完成文件上传。共计【{lstSuccFiles.Count}/{filesPath.Count}】,耗时:{DateTime.Now - startTime}";

                        await stream.RequestStream.WriteAsync(new FileReply
                        {
                            Block = -2, //传输结束
                            Mark  = mark
                        });             //发送结束标记
                    }
                }
            }
            catch (Exception ex)
            {
                if (!cancellationToken.IsCancellationRequested)
                {
                    result.Message = $"文件上传发生异常({ex.GetType()}):{ex.Message}";
                }
            }
            finally
            {
                fs?.Dispose();
            }
            Console.WriteLine(result.Message);
            result.Tag = lstSuccFiles;
            return(result);
        }