123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- using Google.Protobuf;
- using Grpc.Core;
- using GrpcService1;
- using Ips.Service.GpuServer;
- using Microsoft.AspNetCore.Hosting;
- using System.IO;
- namespace GrpcService1.Services
- {
- public class FileService : Ips.Service.GpuServer.FileOper.FileOperBase
- {
- public override async Task<UploadFileResponse> UploadFile(
- IAsyncStreamReader<UploadFileRequest> requestStream, ServerCallContext context)
- {
- var requests = new Queue<UploadFileRequest>();
- 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<DownloadFileResponse> 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<HelloReply> Test(HelloRequest request, ServerCallContext context)
- {
- return Task.FromResult(new HelloReply
- {
- Message = "Hello " + request.Name
- });
- }
- }
- }
|