REST APIを介してサーバーにファイルを送信しようとしています。ファイルは、サイズやタイプをメールとして送信できるものに制限することはできますが、あらゆるタイプの可能性があります。添付ファイル。
私のアプローチは、ファイルをバイナリストリームとして送信し、サーバーに到着したらファイルに保存することだと思います。 .Netでこれを行う組み込みの方法はありますか、または手動でファイルの内容をデータストリームに変換して送信する必要がありますか?
わかりやすくするために、クライアントコードとサーバーコードの両方を制御しているため、特定のアプローチに限定されません。
RestSharpを調べることをお勧めします
http://restsharp.org/
RestSharpライブラリには、RESTサービスにファイルを投稿するためのメソッドがあります。(RestRequst.AddFile()
)。これは、サーバー側で、エンコードされた文字列を本文に変換すると信じています。ヘッダーのcontent-typeにファイルタイプを指定します。
また、ストリームをbase-64文字列に変換し、それをシリアル化されたjson/xmlオブジェクトのプロパティの1つとして転送することによっても行われます。特にサイズ制限を設定でき、ファイルメタデータを同じオブジェクトの一部としてリクエストに含めたい場合、これは非常にうまく機能します。
それは本当にあなたのファイルがどれくらい大きいかによります。それらが非常に大きい場合は、ストリーミングを検討する必要があります。そのニュアンスについては、このSOかなり完全に投稿: で説明しています)ストリーミングリソースは、 RESTfulパラダイム?
@MutantNinjaCodeMonkeyによるRestSharpの提案に基づいています。私の使用例は、jqueryの$.ajax
メソッドからwebform
データをweb api
コントローラーにポストすることでした。 RESTful APIサービスでは、アップロードされたファイルをリクエストの本文に追加する必要がありました。上記のAddFile
のデフォルトのレストシャープ法により、The request was aborted: The request was canceled
のエラーが発生しました。次の初期化が機能しました:
// Stream comes from web api's HttpPostedFile.InputStream
(HttpContext.Current.Request.Files["fileUploadNameFromAjaxData"].InputStream)
using (var ms = new MemoryStream())
{
fileUploadStream.CopyTo(ms);
photoBytes = ms.ToArray();
}
var request = new RestRequest(Method.PUT)
{
AlwaysMultipartFormData = true,
Files = { FileParameter.Create("file", photoBytes, "file") }
};
次の説明を確認してください。 HttpRequestMessageまたはStreamを使用したRESTファイルのアップロード?
これをPOSTリクエストとしてサーバーに送信し、ファイルをFormParamとして渡します。
@POST
@Path("/upload")
//@Consumes(MediaType.MULTIPART_FORM_DATA)
@Consumes("application/x-www-form-urlencoded")
public Response uploadFile( @FormParam("uploadFile") String script, @HeaderParam("X-Auth-Token") String STtoken, @Context HttpHeaders hh) {
// local variables
String uploadFilePath = null;
InputStream fileInputStream = new ByteArrayInputStream(script.getBytes(StandardCharsets.UTF_8));
//System.out.println(script); //debugging
try {
uploadFilePath = writeToFileServer(fileInputStream, SCRIPT_FILENAME);
}
catch(IOException ioe){
ioe.printStackTrace();
}
return Response.ok("File successfully uploaded at " + uploadFilePath + "\n").build();
}
private String writeToFileServer(InputStream inputStream, String fileName) throws IOException {
OutputStream outputStream = null;
String qualifiedUploadFilePath = SIMULATION_RESULTS_PATH + fileName;
try {
outputStream = new FileOutputStream(new File(qualifiedUploadFilePath));
int read = 0;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
outputStream.flush();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
finally{
//release resource, if any
outputStream.close();
}
return qualifiedUploadFilePath;
}