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