【问题标题】:Powershell is unable to upload zip file over ~50MB using Multipart form-data to REST APIPowershell 无法使用 Multipart form-data 将超过 50MB 的 zip 文件上传到 REST API
【发布时间】:2021-09-03 01:19:24
【问题描述】:

我在 .net core 3.1 中有一个 REST API 端点,如下所示:

        [Route("Install")]
        [HttpPost]
        [RequestSizeLimit(524288000)]
        public async Task<IActionResult> AddInstallFile(List<IFormFile> files)

我可以通过以下命令使用 cURL 上传文件:

curl -X POST MYURL Content-Type: multipart/form-data" -F "files=@filename.zip;type=application/x-zip-compressed"

它也可以通过 swagger 工作

在 powershell 中,虽然 Multipart/form-data 本身不受支持,所以我使用以下代码上传到那里(本质上我使用了工作 swagger 上传和 chrome 开发工具中的“复制为 Powershell”功能来创建此代码) :

$fileBytes = [System.IO.File]::ReadAllBytes("C:\Temp\filename.zip");
$enc = [System.Text.Encoding]::GetEncoding('utf-8')
$fileEnc = $enc.GetString($fileBytes)
    

Invoke-WebRequest -Uri "MYURL" `
-Method "POST" `
-Headers @{
 "method"="POST"
 "accept"="application/octet-stream"
 "accept-encoding"="gzip, deflate, br"
} `
-ContentType "multipart/form-data; boundary=----WebKitFormBoundaryT2XycANuthCIUwGk" `
-Body ([System.Text.Encoding]::UTF8.GetBytes("------WebKitFormBoundaryT2XycANuthCIUwGk$([char]13)$([char]10)Content-Disposition: form-data; name=`"files`"; filename=`"filename.zip`"$([char]13)$([char]10)Content-Type: application/x-zip-compressed$([char]13)$([char]10)$([char]13)$([char]10)$fileEnc$([char]13)$([char]10)------WebKitFormBoundaryT2XycANuthCIUwGk--$([char]13)$([char]10)"))

此 Powershell 代码适用于我拥有的小于 2MB 的 zip 文件,但不适用于另一个超过 80MB 的 zip 文件

服务器上的错误在这里:

An unhandled exception has occurred while executing the request.

Exception: 
System.ArgumentNullException: Value cannot be null. (Parameter 'source')
   at System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
   at System.Linq.Enumerable.Sum[TSource](IEnumerable`1 source, Func`2 selector)
   at netproject.ControllerClass.AddInstallFile(List`1 files) in ControllerClass.cs:line 44

基本上,当从 powershell 调用超过 ~50MB 的文件时,files 变量会以 null 的形式出现。 我已经尝试过 Invoke-WebRequest 和 Invoke-RestMethod,结果相同

【问题讨论】:

  • 你检查了吗:Upload BIG files via HTTP
  • 对于小于 100MB 的文件不应该是必需的。他们谈论的是千兆字节的文件。老实说,开始认为我发现了一个 PowerShell 错误。代码适用于 50MB 以下的文件,然后莫名其妙地中断超过 80MB 的文件这一事实非常奇怪。我现在已经设法使用 Postman、swagger、cURL 和 web 表单,只是没有使用 powershell。
  • 我进行了一些实验,但它在 80MB 左右开始失败。唯一的区别是实际文件。我使用相同的文件名和路径进行测试

标签: powershell rest .net-core


【解决方案1】:

对于将来遇到此问题的任何人 - 如果您在 powershell 中获得有效的解决方案,我仍然有兴趣了解它。为了暂时解决这个问题,我使用 .net 框架来上传文件。代码在这里:

    Write-Host "Uploading $name"
    $url = "URL_TO_UPLOAD"
    $file = "FULL_PATH_ZIP_FILE"

    $fs = [System.IO.FileStream]::New($file, [System.IO.FileMode]::Open)
    $f1 = New-Object System.Net.Http.StreamContent $fs

    $client = New-Object System.Net.Http.HttpClient 
    $client.DefaultRequestHeaders.ConnectionClose = $true 
    $client.DefaultRequestHeaders.Add("Authorization", $auth);

    $form = New-Object System.Net.Http.MultipartFormDataContent
    $form.Add($f1, 'files', $name)

    $rsp = $client.PostAsync($url, $form).Result
    Write-Host "Upload status: " + $rsp.StatusCode

    $fs.Close(); 
    $fs.Dispose()

【讨论】:

    猜你喜欢
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多