【问题标题】:How can I send a File over a REST API?如何通过 REST API 发送文件?
【发布时间】:2016-03-23 00:05:27
【问题描述】:

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

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

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

【问题讨论】:

  • "将文件序列化为二进制"是什么意思?所有文件都是二进制文件。你在问什么究竟?请参阅How To Accept a File POST - ASP.Net MVC 4 WebAPI 了解一些起点。
  • 你说得对,序列化是错误的说法,我的意思是我需要直接发送二进制数据流,还是使用其他工具为我发送。我已经澄清了这个问题,@MutantNinjaCodeMonkey 的回答正是我所需要的

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


【解决方案1】:
  1. 检测与请求一起传输的文件。
  2. 决定上传文件的路径(并确保该目录存在 CHMOD 777)
  3. 接受客户端连接
  4. 使用现成的库进行实际上传

查看以下讨论: REST file upload with HttpRequestMessage or Stream?

【讨论】:

【解决方案2】:

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

RestSharp 库具有将文件发布到 REST 服务的方法。 (RestRequst.AddFile())。我相信在服务器端,这将转换为正文中的编码字符串,标头中的内容类型指定文件类型。

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

这实际上取决于您的文件有多大。如果它们非常大,您需要考虑流式传输,其中的细微差别已在此 SO 帖子中进行了非常详尽的介绍:How do streaming resources fit within the RESTful paradigm?

【讨论】:

  • 这正是我所需要的,感谢您朝着正确的方向前进。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    基于@MutantNinjaCodeMonkey 对 RestSharp 的建议。我的用例是将 jquery 的 $.ajax 方法中的 webform 数据发布到 web api 控制器中。 RESTful API 服务需要将上传的文件添加到请求正文中。上面提到的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") }
    };
    

    【讨论】:

      猜你喜欢
      • 2019-08-22
      • 2018-08-26
      • 2020-11-14
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 2015-08-29
      • 2018-12-31
      相关资源
      最近更新 更多