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
相关产品推荐
相关产品推荐

