如何通过REST API发送文件?

时间:2015-12-16 18:02:55

标签: c# .net api rest file-upload

我正在尝试通过REST API将文件发送到服务器。该文件可能是任何类型的,但它的大小和类型可以限制为可以作为电子邮件附件发送的内容。

我认为我的方法是将文件作为二进制流发送,然后在它到达服务器时将其保存回文件中。是否有内置的方法在.Net中执行此操作,还是需要手动将文件内容转换为数据流并发送?

为清楚起见,我可以控制客户端和服务器代码,因此我不受任何特定方法的限制。

4 个答案:

答案 0 :(得分:6)

我建议您查看 RestSharp
http://restsharp.org/

RestSharp库具有将文件发布到REST服务的方法。 (<!doctype html> <html> <head> <script src="main.js"></script> <script type="text/javascript" src="external/jquery/jquery.js"></script> <script type="text/javascript" src="jquery-ui.js"></script> <link href="jquery-ui.css" rel="stylesheet" type="text/css" media="screen" /> </head> <body onload="buildDocument();"> <div id="tabs"> </div> </body> </html> )。我相信在服务器端,这将转换为正文中的编码字符串,标题中的content-type指定文件类型。

我也看到它通过将流转换为base-64字符串并将其作为序列化json / xml对象的属性之一进行传输来完成。特别是如果您可以设置大小限制并希望在请求中包含文件元数据作为同一对象的一部分,这非常有效。

这实际上取决于你的文件有多大。如果它们非常大,你需要考虑流式传输,其中的细微差别在这个SO帖子中非常彻底地涵盖:How do streaming resources fit within the RESTful paradigm?

答案 1 :(得分:1)

建立@ MutantNinjaCodeMonkey对RestSharp的建议。我的用例是将来自jquery的webform方法的$.ajax数据发布到web api控制器中。 restful API服务需要将上传的文件添加到请求Body中。上面提到的AddFile的默认restsharp方法导致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") }
};

答案 2 :(得分:0)

  1. 使用请求检测正在传输的文件。
  2. 确定将上传文件的路径(并确保此目录存在CHMOD 777)
  3. 接受客户端连接
  4. 使用ready库进行实际上传
  5. 回顾以下讨论: REST file upload with HttpRequestMessage or Stream?

答案 3 :(得分:0)

您可以将其作为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;
    }