Khi tôi tải các tệp lớn lên api web của mình trong ASP.NET Core, thời gian chạy sẽ tải tệp vào bộ nhớ trước khi chức năng xử lý và lưu trữ tải lên được kích hoạt . Với tải lên lớn, điều này trở thành một vấn đề vì nó chậm và đòi hỏi nhiều bộ nhớ hơn. Đối với các phiên bản trước của ASP.NET there are some articles về cách vô hiệu hóa việc đệm yêu cầu, nhưng tôi không thể tìm thấy bất kỳ thông tin nào về cách thực hiện việc này với ASP.NET Core. Là nó có thể vô hiệu hóa các bộ đệm của yêu cầu vì vậy tôi không chạy ra khỏi bộ nhớ trên máy chủ của tôi tất cả các thời gian?Xử lý các tệp tải lên lớn trên ASP.NET Core 1.0
Trả lời
Sử dụng Microsoft.AspNetCore.WebUtilities.MultipartReader
vì nó ...
có thể phân tích bất kỳ dòng [với] đệm tối thiểu. Nó cung cấp cho bạn các tiêu đề và phần thân của mỗi phần tại một thời điểm và sau đó bạn làm những gì bạn muốn với phần thân của phần đó (bộ đệm, loại bỏ, ghi vào đĩa, vv).
Đây là ví dụ trung gian.
app.Use(async (context, next) =>
{
if (!IsMultipartContentType(context.Request.ContentType))
{
await next();
return;
}
var boundary = GetBoundary(context.Request.ContentType);
var reader = new MultipartReader(boundary, context.Request.Body);
var section = await reader.ReadNextSectionAsync();
while (section != null)
{
// process each image
const int chunkSize = 1024;
var buffer = new byte[chunkSize];
var bytesRead = 0;
var fileName = GetFileName(section.ContentDisposition);
using (var stream = new FileStream(fileName, FileMode.Append))
{
do
{
bytesRead = await section.Body.ReadAsync(buffer, 0, buffer.Length);
stream.Write(buffer, 0, bytesRead);
} while (bytesRead > 0);
}
section = await reader.ReadNextSectionAsync();
}
context.Response.WriteAsync("Done.");
});
Dưới đây là những người trợ giúp.
private static bool IsMultipartContentType(string contentType)
{
return
!string.IsNullOrEmpty(contentType) &&
contentType.IndexOf("multipart/", StringComparison.OrdinalIgnoreCase) >= 0;
}
private static string GetBoundary(string contentType)
{
var elements = contentType.Split(' ');
var element = elements.Where(entry => entry.StartsWith("boundary=")).First();
var boundary = element.Substring("boundary=".Length);
// Remove quotes
if (boundary.Length >= 2 && boundary[0] == '"' &&
boundary[boundary.Length - 1] == '"')
{
boundary = boundary.Substring(1, boundary.Length - 2);
}
return boundary;
}
private string GetFileName(string contentDisposition)
{
return contentDisposition
.Split(';')
.SingleOrDefault(part => part.Contains("filename"))
.Split('=')
.Last()
.Trim('"');
}
Tài liệu tham khảo bên ngoài
Có vẻ như mã này hoạt động hoàn hảo trên dnx451 nhưng nó có rò rỉ bộ nhớ trên dnxcore50. Có thể là một cái gì đó đang được cố định cho RC2 mặc dù. – Martin
GetFileName() từ đoạn mã trên làm cho máy chủ đệm toàn bộ tệp. Tôi thay thế nó bằng tên tập tin ngẫu nhiên, nhưng sau khi viết tất cả các khối để tập tin tôi thấy rằng việc sử dụng bộ nhớ tăng lên bởi số tiền bằng với kích thước tập tin. Nó có thể được thực sự ok, nếu GC tiếp tục sẽ thoát khỏi nó. Nhưng có vẻ như không ok – EvAlex
@EvAlex 'GetFileName' chỉ phân tích một chuỗi. Có cái gì khác đang xảy ra trước hoặc sau đó có thể gây ra các máy chủ để đệm toàn bộ tập tin? –
Trong bạn Controller
bạn chỉ có thể sử dụng Request.Form.Files
để truy cập các tập tin:
[HttpPost("upload")]
public async Task<IActionResult> UploadAsync(CancellationToken cancellationToken)
{
if (!Request.HasFormContentType)
return BadRequest();
var form = Request.Form;
foreach(var formFile in form.Files)
{
using(var readStream = formFile.OpenReadStream())
{
// Do something with the uploaded file
}
}
return Ok();
}
- 1. Tải lên các tệp lớn (1GB) -ASP.net
- 2. Tải lên tệp lớn lên asp.net MVC
- 3. Ngăn tải lên các tệp lớn trong ASP.NET 4.0
- 4. Xử lý nhiều tệp tải lên đồng thời lớn
- 5. Tải lên tệp lớn
- 6. Tải lên tệp và JSON trong ASP.NET Core Web API
- 7. Làm cách nào để xử lý các tệp tải lên lớn qua WCF?
- 8. Tải lên tệp quá lớn
- 9. Đăng các tệp từ ASP.NET Core web api lên một trang web ASP.NET Core khác api
- 10. Cách xử lý các tệp đã tải lên trong webapp2
- 11. Xử lý các tệp lớn trong Haskell
- 12. Tải lên các tệp lớn trong .NET
- 13. CodeIgniter Tải lên các tệp lớn
- 14. Dự án ASP.NET Core 1.0 F #
- 15. Xử lý các tệp lớn trong java
- 16. NSURLSession tải lên các tệp lớn
- 17. Xampp - PHPMyAdmin tải lên các tệp lớn?
- 18. Xử lý tải lên được tải lên của các bản tải lên ở phía máy chủ
- 19. Chuyển các tệp từ node_modules sang wwwroot với gulp trong dự án VS2015 asp.net core 1.0
- 20. Cách xử lý tải lên tệp bằng Angular2 Formbuilder?
- 21. xử lý tệp lớn trong svnsync
- 22. Đọc một tệp excel trên lõi asp.net 1.0
- 23. Tải tệp lên trên 2Gb lên IIS 8/ASP.NET 4.5?
- 24. tải lên tệp bằng cách sử dụng jquery ajax và trình xử lý asp.net
- 25. Định cấu hình Apache cho các tệp tải lên lớn
- 26. Tải lên và xử lý tệp bằng Python
- 27. Xử lý nhiều tệp tải lên bằng Plack
- 28. Tải lên tệp trong Spring Boot: Tải lên, xác thực và xử lý ngoại lệ
- 29. Tham khảo thư viện trong ASP.NET Core 1.0 (vNext)
- 30. phản ứng js xử lý tệp tải lên
Tôi viết phụ đề tải lên tệp của mình để hỗ trợ tải lên tệp theo các phần nhỏ theo api cho [flowjs] (https://github.com/flowjs/flow.js) – jltrem
Xin chào @jltrem, bạn có thể chia sẻ lõi asp.net không điều khiển và mã góc xử lý các tệp được tải lên bằng flowjs? –