web-dev-qa-db-ja.com

REST APIを介してファイルを送信するにはどうすればよいですか?

REST APIを介してサーバーにファイルを送信しようとしています。ファイルは、サイズやタイプをメールとして送信できるものに制限することはできますが、あらゆるタイプの可能性があります。添付ファイル。

私のアプローチは、ファイルをバイナリストリームとして送信し、サーバーに到着したらファイルに保存することだと思います。 .Netでこれを行う組み込みの方法はありますか、または手動でファイルの内容をデータストリームに変換して送信する必要がありますか?

わかりやすくするために、クライアントコードとサーバーコードの両方を制御しているため、特定のアプローチに限定されません。

8
Kevin Wells

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") }
};
1
Ben Sewards
  1. リクエストで転送されているファイルを検出します。
  2. ファイルがアップロードされるパスを決定します(このディレクトリにCHMOD 777が存在することを確認してください)
  3. クライアント接続を受け入れる
  4. 実際のアップロードに準備ができたライブラリを使用する

次の説明を確認してください。 HttpRequestMessageまたはStreamを使用したRESTファイルのアップロード?

0
Daniel Golub

これを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;
    }
0
Erick