Для очень больших файлов наиболее эффективным способом является выгрузка файла в виде HTTP File Upload (т.е. multipart / form-data).Если вместо этого вы хотите отправлять большие запросы API, наиболее эффективным форматом для двоичных данных является Протокол буфера или Пакет сообщений .
Но обычно вы отправляете большиефайлы данных через HTTP File Upload.ServiceStack не накладывает никаких ограничений на размер самой загрузки, поэтому любые ограничения будут налагаться на базовый HTTP-сервер.Я бы порекомендовал начать с одного из базовых шаблонов проектов .NET , базовый HTTP-сервер Kestrel которого более эффективен, чем HTTP-серверы ASP.NET или HttpListener, доступные в .NET Framework.
В есть примеры быстрой загрузки файлов документы:
Загрузка файлов
Вы можете получить доступ к загруженным файлам независимо от запроса DTO, используя Request.Files
.Например:
public object Post(MyFileUpload request)
{
if (this.Request.Files.Length > 0)
{
var uploadedFile = base.Request.Files[0];
uploadedFile.SaveTo(MyUploadsDirPath.CombineWith(file.FileName));
}
return HttpResult.Redirect("/");
}
ServiceStack imgur.servicestack.net В примере показано, как получить доступ к потоку байтов нескольких загруженных файлов , например:
public object Post(Upload request)
{
foreach (var uploadedFile in base.Request.Files
.Where(uploadedFile => uploadedFile.ContentLength > 0))
{
using (var ms = new MemoryStream())
{
uploadedFile.WriteTo(ms);
WriteImage(ms);
}
}
return HttpResult.Redirect("/");
}
Request.Files
- это коллекция загруженных файлов, предоставляемая базовым HTTP-сервером, т.е. ServiceStack не буферизирует никакое содержимое.
Вы можете загружать HTTP-файлы, используя HTTP Utils PostFileToUrl () или UploadFile () API .Сервисные клиенты ServiceStack C # также имеют ряд API загрузки файлов , где вы можете отправить несколько загрузок файлов, а также заполненный запрос DTO с несколькими загрузками файлов:
Загрузка файлов
Вы можете использовать PostFile
API для загрузки одного файла с указанием маршрута службы, которую вы хотите вызвать, имени файла и Stream
его содержимого, например:
var client = new JsonServiceClient(baseUrl);
using (var fileStream = new FileInfo(filePath).OpenRead())
{
var fileName = "upload.html";
var response = client.PostFile<FileUploadResponse>("/files/upload",
fileStream, fileName, MimeTypes.GetMimeType(fileName));
}
Файлы, загруженные с помощью PostFile*
API, загружаются как HTTP POST, используя multipart/form-data
Content-Type, к которому можно получить доступ из коллекции IRequest.Files
в ваших Сервисах, например:
[Route("/files/upload")]
public class UploadFile {}
public class UploadFileService : Service
{
readonly string UploadsDir = "uploads";
public object Post(UploadFile request)
{
var uploadedFile = base.Request.Files[0];
VirtualFiles.WriteFile(UploadsDir.CombineWith(uploadedFile.FileName), uploadedFile.InputStream);
return new FileUploadResponse { ... };
}
}
Вы можетеиспользуйте API PostFileWithRequest
. Для добавления дополнительных метаданных в загрузку файлов, например:
[DataContract]
[Route("/files/upload")]
public class FileUpload : IReturn<FileUploadResponse>
{
[DataMember]
public int CustomerId { get; set; }
[DataMember]
public DateTime CreatedDate { get; set; }
}
var client = new JsonHttpClient(baseUrl);
var fileInfo = new FileInfo(filePath);
using (var fileStream = fileInfo.OpenRead())
{
var request = new FileUpload {
CustomerId = customerId,
CreatedDate = fileInfo.CreationTimeUtc,
};
var response = client.PostFileWithRequest<FileUploadResponse>(
"/files/upload", fileStream, fileInfo.Name, request);
}
Загрузка нескольких файлов
API PostFilesWithRequest
, доступные на всех клиентах службы .NET, позволяют вамлегко загружать несколько потоков в рамках одного HTTP-запроса.Он поддерживает заполнение запроса DTO любой комбинацией QueryString и POST-формы FormData в дополнение к нескольким потокам данных загрузки файлов:
using (var stream1 = uploadFile1.OpenRead())
using (var stream2 = uploadFile2.OpenRead())
{
var client = new JsonServiceClient(baseUrl);
var response = client.PostFilesWithRequest<MultipleFileUploadResponse>(
"/multi-fileuploads?CustomerId=123",
new MultipleFileUpload { CustomerName = "Foo,Bar" },
new[] {
new UploadFile("upload1.png", stream1),
new UploadFile("upload2.png", stream2),
});
}
Пример с использованием только типизированного запроса DTO.JsonHttpClient
также включает асинхронные эквиваленты для каждого из PostFilesWithRequest
API:
using (var stream1 = uploadFile1.OpenRead())
using (var stream2 = uploadFile2.OpenRead())
{
var client = new JsonHttpClient(baseUrl);
var response = await client.PostFilesWithRequestAsync<MultipleFileUploadResponse>(
new MultipleFileUpload { CustomerId = 123, CustomerName = "Foo,Bar" },
new[] {
new UploadFile("upload1.png", stream1),
new UploadFile("upload2.png", stream2),
});
}