使用RestSharp发送文件确实包含文件

问题描述 投票:0回答:1

我想使用 Post 上传文件。使用 Postman 时,一切正常,文件按预期上传,但当我尝试使用 RestSharp 时,我的文件始终为空。 我是不是做错了什么?

根据官方文档,一切都是正确的。 https://restsharp.dev/docs/next/usage/request#uploading-files

我在 Stackoverflow 上找到了以下问题,但它有点过时,并且与当前版本的 RestSharp 不匹配。

RestSharp 使用流添加文件

测试:

    [Fact]
    public async Task Upload_ShouldWork()
    {
        //Arrange
        await this._fixture.Login();
        FileStream stream = File.OpenRead("C:\\Users\\Franz Seidl\\OneDrive\\Bilder\\testImage.png");
        //Act
        var result = await this._testClass.Upload(stream, 1, true);
        //Assert
        result.Should().BeTrue();
    }

客户:

public async Task<bool> Upload(Stream fileStream, int id, bool force = false)
{
        var request = new RestRequest($"{BaseUrl}Upload/{{id}}");
        var fileParam = FileParameter.Create("upload",() => fileStream,"upload.png");
        
        request.AddUrlSegment("id", id.ToString());
        request.AddQueryParameter("force", force.ToString());
        request.AddFile("upload.png", () => fileStream,"upload.png", ContentType.Binary);
        var result = await this._client.PostAsync<bool>(request);
        return result;
}

后端代码:

[HttpPost("Upload/{id}")]
public async Task<ActionResult<bool>> UploadImage([FromRoute] int id, [FromQuery] bool force=false)
{
    try
    {
        if (Request.ContentLength == 0 && Request.Body != null) throw new ArgumentException("No file provided");
        var fileStream = Request.Body;
        var result = await this._service.Upload(fileStream,id,force);
        return result;
    }
    catch (ArgumentException e)
    {
        var errorDTO = this._exceptionHandler.HandleExceptionAndCreateDTO(e);
        return this.BadRequest(errorDTO);
    }
    catch (Exception e)
    {
        var errorDTO = this._exceptionHandler.HandleExceptionAndCreateDTO(e);
        return StatusCode(StatusCodes.Status500InternalServerError, errorDTO);
    }
}

我还尝试将请求发送到Postman MockServer,结果如下所示。

Request against PostmanMockServer

每个 Postman 发送请求时的另一个有趣的细节是,Request.ContentLength 是 1444,与 FileStream 的值相同。 但是当使用 RestSharp 发送时,Request.Content 为 1643。 可能是文件编码不正确。

c# rest post upload restsharp
1个回答
0
投票

您可以使用

request.Files.Add
添加文件,同时您还可以声明内容长度:

request.Files.Add(
  new FileParameter {
    ContentLength = 1444,
    ContentType = ContentType.Binary,
    FileName = "testImage.png",
    Name = "attachedFile",
    Writer = (s) => {
      fileStream.CopyTo(s);
    }
  }
);
© www.soinside.com 2019 - 2024. All rights reserved.