ファイルをアップロードする最良の(そして最速の)方法は、通常のリクエスト変数としてエンコードするのではなく、ContentType multipart / form-dataを使用した通常のHTTPアップロードとしてWebサービスにアップロードすることです。つまり、HTMLフォームが現在ファイルをurl。
ServiceStackには、アップロードされたファイルをこのように処理するための組み込みサポートがあります。ServiceStackのRestFilesサンプルプロジェクトでこれを行う方法の完全な例です。
ServiceClientを使用してファイルをアップロードするには、次の例に示す.PostFile <T>()メソッドを使用できます。
var fileToUpload = new FileInfo(FilesRootDir + "TESTUPLOAD.txt");
var response = restClient.PostFile<FilesResponse>(WebServiceHostUrl + "files/README.txt",
fileToUpload, MimeTypes.GetMimeType(fileToUpload.Name));
アップロードされたすべてのファイルは、SaveTo()メソッドで(ストリームまたはファイルとして)簡単に処理base.RequestContext.Files
できるコレクションを介して利用可能になります。
foreach (var uploadedFile in base.RequestContext.Files)
{
var newFilePath = Path.Combine(targetDir.FullName, uploadedFile.FileName);
uploadedFile.SaveTo(newFilePath);
}
同様に、ファイル応答を(添付ファイルとしてまたは直接)返すことに関連して、次のようなHttpResultでFileInfoを返す必要があります。
return new HttpResult(FileInfo, asAttachment:true);
複数のファイルのアップロード
PostFilesWithRequest
すべての.NETサービスクライアントで利用可能なAPIを使用して、単一のHTTPリクエスト内で複数のストリームをアップロードすることもできます。複数のファイルアップロードデータストリームに加えて、 QueryString
とPOSTされたFormDataの任意の組み合わせを要求DTOに入力することをサポートします。
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のみを使用した例。また、各APIJsonHttpClient
の非同期同等物も含まれています。PostFilesWithRequest
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),
});
}