Для загрузки файлов лучшим (и самым быстрым) способом является , а не , кодировать его как обычную переменную запроса, а просто загрузить его в веб-службу как обычный HTTP Upload с ContentType multipart / form-data , т. е. как формы HTML в настоящее время отправляют файлы на URL.
ServiceStack имеет встроенную поддержку для обработки загруженных файлов таким образом, где полный пример того, как это сделатьв примере проекта RestFiles ServiceStack .
Для загрузки файлов с использованием ServiceClient вы можете использовать метод .PostFile () , показанный в этом примере :
var fileToUpload = new FileInfo(FilesRootDir + "TESTUPLOAD.txt");
var response = restClient.PostFile<FilesResponse>(WebServiceHostUrl + "files/README.txt",
fileToUpload, MimeTypes.GetMimeType(fileToUpload.Name));
Все загруженные файлы доступны через коллекцию base.RequestContext.Files
, которую вы можете легко обработать с помощью метода SaveTo () (в виде потока или файла).
foreach (var uploadedFile in base.RequestContext.Files)
{
var newFilePath = Path.Combine(targetDir.FullName, uploadedFile.FileName);
uploadedFile.SaveTo(newFilePath);
}
Аналогично, для возврата ответа файла (в виде вложения или напрямую) вам просто нужно вернуть FileInfo в HttpResult, например :
return new HttpResult(FileInfo, asAttachment:true);
Несколько файлов Uploads
Вы также можете использовать API PostFilesWithRequest
, доступные на всех клиентских сервисах .NET, для загрузки нескольких потоков в рамках одного HTTP-запроса.Он поддерживает заполнение Request DTO любой комбинацией QueryString и POST'ed 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),
});
}