FileService.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using Google.Protobuf;
  2. using Grpc.Core;
  3. using GrpcService1;
  4. using Ips.Service.GpuServer;
  5. using Microsoft.AspNetCore.Hosting;
  6. using System.IO;
  7. namespace GrpcService1.Services
  8. {
  9. public class FileService : Ips.Service.GpuServer.FileOper.FileOperBase
  10. {
  11. public override async Task<UploadFileResponse> UploadFile(
  12. IAsyncStreamReader<UploadFileRequest> requestStream, ServerCallContext context)
  13. {
  14. var requests = new Queue<UploadFileRequest>();
  15. while (await requestStream.MoveNext())
  16. {
  17. var request = requestStream.Current;
  18. requests.Enqueue(request);
  19. }
  20. var first = requests.Peek();
  21. var fileExt = Path.GetExtension(first.FileName);
  22. var fileName = $"{Guid.NewGuid().ToString()}{fileExt}";
  23. var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Upload", fileName);
  24. var fileFolder = Directory.GetParent(filePath);
  25. if (fileFolder != null && !fileFolder.Exists)
  26. fileFolder.Create();
  27. using (var fileStream = File.Open(filePath, FileMode.Append, FileAccess.Write))
  28. {
  29. var received = 0L;
  30. while (requests.Count() > 0)
  31. {
  32. var current = requests.Dequeue();
  33. var buffer = current.Content.ToByteArray();
  34. fileStream.Seek(received, SeekOrigin.Begin);
  35. await fileStream.WriteAsync(buffer);
  36. received += buffer.Length;
  37. }
  38. return new UploadFileResponse() { FilePath = $"/Upload/{fileName}" };
  39. }
  40. }
  41. public override async Task DownloadFile(DownloadFileRequest request,
  42. IServerStreamWriter<DownloadFileResponse> responseStream, ServerCallContext context)
  43. {
  44. var filePath = Path.Combine(Directory.GetCurrentDirectory(), request.FilePath);
  45. if (File.Exists(filePath))
  46. {
  47. using (var fileStream = File.OpenRead(filePath))
  48. {
  49. var received = 0L;
  50. var totalLength = fileStream.Length;
  51. var buffer = new byte[1024 * 1024]; // 每次最多发送 1M 的文件内容
  52. while (received < totalLength)
  53. {
  54. var length = await fileStream.ReadAsync(buffer);
  55. received += length;
  56. var response = new DownloadFileResponse()
  57. {
  58. Content = ByteString.CopyFrom(buffer),
  59. TotalSize = totalLength
  60. };
  61. await responseStream.WriteAsync(response);
  62. }
  63. }
  64. }
  65. }
  66. public override Task<HelloReply> Test(HelloRequest request, ServerCallContext context)
  67. {
  68. return Task.FromResult(new HelloReply
  69. {
  70. Message = "Hello " + request.Name
  71. });
  72. }
  73. }
  74. }