You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell 7:如何将字节数组转为FileInfo并通过表单上传?

解决PowerShell中字节数组直接上传表单失败的问题

你遇到的核心问题是:直接把图片字节数组塞到Invoke-WebRequest的Form参数里,PowerShell不会自动生成文件上传所需的HTTP头信息(比如Content-Disposition、Content-Type),导致接收端无法识别这是图片文件。不需要把字节数组转成System.IO.FileInfo(那是磁盘文件的抽象对象),直接在内存里构造符合multipart/form-data格式的请求内容即可。

可行的解决方案代码

# 1. 从内容服务获取图片字节数组
$fetchParams = @{
    Uri    = 'https://content.site/media?id=82348'
    Method = 'GET'
}
$fetchResponse = Invoke-WebRequest @fetchParams
$imageBytes = $fetchResponse.Content

# 2. 构造符合要求的多部分表单内容
# 创建多部分表单容器
$multipartForm = [System.Net.Http.MultipartFormDataContent]::new()

# 处理图片文件:包装字节数组,指定内容类型和文件名
$fileContent = [System.Net.Http.ByteArrayContent]::new($imageBytes)
$fileContent.Headers.ContentType = [System.Net.Http.Headers.MediaTypeHeaderValue]::Parse('image/jpeg')
# 第三个参数是传给接收端的文件名,可按需修改
$multipartForm.Add($fileContent, 'file', '82348.jpg')

# 添加id字段
$idContent = [System.Net.Http.StringContent]::new('82348')
$multipartForm.Add($idContent, 'id')

# 3. 发送上传请求
$ingestParams = @{
    Uri         = 'https://internal.site/ingest'
    Method      = 'POST'
    Content     = $multipartForm
    Headers     = @{ 
        'Content-Type' = $multipartForm.Headers.ContentType.ToString()
    }
}
$ingestResponse = Invoke-WebRequest @ingestParams

为什么原来的方法失效?

当你直接把字节数组赋值给Form参数的file键时,PowerShell会把它当作普通的文本/字节字段处理,不会添加文件上传必需的Content-Disposition: form-data; name="file"; filename="xxx.jpg"头,也不会设置图片对应的Content-Type: image/jpeg,接收端自然无法识别这是一个文件。

而用MultipartFormDataContent可以手动控制这些头信息,全程在内存中完成处理,完全不需要写入本地磁盘。

内容的提问来源于stack exchange,提问作者Jerkle Berry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 06:52:32