代码之家  ›  专栏  ›  技术社区  ›  FullStackOverflowDev

从retrofit2发送多部分主体并在ASP核心中进行处理

  •  0
  • FullStackOverflowDev  · 技术社区  · 7 年前

    我目前正在发送一个带有追溯功能的Android应用程序的订单对象2

    @PUT("orders/insert")
    Call<Order> putOrders(@Body Order order);
    

    我的ASP核心Web API如下:

    [HttpPut("api/orders/update")]
        public async Task UpdateOrder([FromBody] Order order)
        {
            await OrdersRepository.UpdateOrder(order);
        }
    

    但现在我还想在我的请求中附加一个图像。最初,我尝试在我的Android应用程序中将图像转换为byte[]数组,并将其作为order对象的一部分传递,但结果在API中获得了一个空顺序(较小的字节数组似乎可以工作),因此我决定以多部分正文请求的形式发送图像。

    我的问题是,我不确定是否在revifit2中正确地创建了请求,也不知道如何在API中将请求从请求处理为文件和订单对象,因为只有一个[frombody]属性。

    这就是我如何定义我的回顾界面2

    @Multipart
    @POST("uploadAttachmentorders/uploadfile")
    Call<Order> uploadSignature(@Part MultipartBody.Part filePart, @Part("Order") Order order);
    

    这就是实际通话的样子:

            Order order = orders.getOrders().get(0);
            File clientSignatureFile = new File(context.getCacheDir(),order.getId().toString());
            clientSignatureFile.createNewFile();
            FileOutputStream fos = new FileOutputStream(clientSignatureFile);
            fos.write(order.getClientSignature());
            fos.flush();
            fos.close();
            MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", clientSignatureFile.getName(), RequestBody.create(MediaType.parse("image/*"), clientSignatureFile));
    
            Call<Order> callFile = apiService.uploadSignature(filePart,order);
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Alex Riabov Vikrant    7 年前

    您的方法应该创建一个多部分/表单数据类型的请求。ASP.NET核心具有内置类 IFormFile 支持文件上传。可以使用该类型的属性和模型的属性创建模型:

    public class OrderViewModel
    {
        public Order Order { get;set; }
    
        public IFormFile File { get; set; }
    }
    

    你的方法应该是:

    [HttpPost]
    public IActionResult CreateOrder(OrderViewModel ovm)
    {
        var order = ovm.Order;
    
        if (ovm.File != null)
        {
            byte[] fileData = null;
    
            // read file to byte array
            using (var binaryReader = new BinaryReader(ovm.File.OpenReadStream()))
            {
                fileData = binaryReader.ReadBytes((int)ovm.File.Length);
            }
        }
    }