using Google.Protobuf; using Grpc.Core; using GrpcService1; using Ips.Service.CpuServer; using Microsoft.AspNetCore.Hosting; using System.IO; namespace GrpcService1.Services { public class FileService : Ips.Service.CpuServer.FileOper.FileOperBase { public override async Task UploadFile( IAsyncStreamReader requestStream, ServerCallContext context) { var requests = new Queue(); while (await requestStream.MoveNext()) { var request = requestStream.Current; requests.Enqueue(request); } var first = requests.Peek(); var fileExt = Path.GetExtension(first.FileName); var fileName = $"{Guid.NewGuid().ToString()}{fileExt}"; var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Upload", fileName); var fileFolder = Directory.GetParent(filePath); if (fileFolder != null && !fileFolder.Exists) fileFolder.Create(); using (var fileStream = File.Open(filePath, FileMode.Append, FileAccess.Write)) { var received = 0L; while (requests.Count() > 0) { var current = requests.Dequeue(); var buffer = current.Content.ToByteArray(); fileStream.Seek(received, SeekOrigin.Begin); await fileStream.WriteAsync(buffer); received += buffer.Length; } return new UploadFileResponse() { FilePath = $"/Upload/{fileName}" }; } } public override async Task DownloadFile(DownloadFileRequest request, IServerStreamWriter responseStream, ServerCallContext context) { var filePath = Path.Combine(Directory.GetCurrentDirectory(), request.FilePath); if (File.Exists(filePath)) { using (var fileStream = File.OpenRead(filePath)) { var received = 0L; var totalLength = fileStream.Length; var buffer = new byte[1024 * 1024]; // 每次最多发送 1M 的文件内容 while (received < totalLength) { var length = await fileStream.ReadAsync(buffer); received += length; var response = new DownloadFileResponse() { Content = ByteString.CopyFrom(buffer), TotalSize = totalLength }; await responseStream.WriteAsync(response); } } } } public override Task Test(HelloRequest request, ServerCallContext context) { return Task.FromResult(new HelloReply { Message = "Hello " + request.Name }); } } }