调用UploadFilePart遇155异常,求PowerShell上传Vault文件解决办法
Autodesk Vault 上传文件「155」异常解决
我在将本地文件检入Autodesk Vault时,需获取上传凭证(upload ticket),但运行以下PowerShell代码时触发「155」异常,求协助修复:
function Upload-FileResource { param ( [Object] $vault, [string] $filename, [byte[]] $fileContents ) $headerObject = New-Object Autodesk.Connectivity.WebServices.FileTransferHeader $headerObject.Identity = New-Guid $headerObject.Extension = [System.IO.Path]::GetExtension($filename) $headerObject.Vault = $vault.WebServiceCredentials.VaultName $uploadTicket = New-Object Autodesk.Connectivity.WebServices.ByteArray $bytesTotal = if ($null -ne $fileContents) { $fileContents.Length } else { 0 } $bytesTransferred = 0 do { $bufferSize = $bytesTotal - $bytesTransferred if ($bufferSize -gt (49 * 1024 * 1024)) { $bufferSize = (49 * 1024 * 1024) } $buffer = $fileContents[$bytesTransferred..($bytesTransferred + $bufferSize - 1)] $headerObject.Compression = "None" $headerObject.IsComplete = ($bytesTransferred + $bufferSize) -eq $bytesTotal $headerObject.UncompressedSize = $bufferSize $fileContentsStream = [System.IO.MemoryStream]::new($buffer) $uploadTicket.Bytes = $vault.FilestoreService.UploadFilePart($fileContentsStream) $bytesTransferred += $bufferSize } while ($bytesTransferred -lt $bytesTotal) return $uploadTicket } $fileContents = [System.IO.File]::ReadAllBytes($localPath) $uploadTicket = Upload-FileResource -vault $vault -filename $fileName -fileContents $fileContents
问题分析与修正
Vault的「155」异常通常与上传上下文不完整、分块逻辑错误或API调用参数缺失有关,原代码存在以下问题:
未传递FileTransferHeader到UploadFilePart
创建的$headerObject未作为参数传入UploadFilePart,Vault无法识别上传的上下文信息,这是触发155错误的核心原因。上传凭证字节覆盖而非累加
每次分块上传返回的ticket字节直接覆盖$uploadTicket.Bytes,导致最终凭证不完整。数组切片边界越界
PowerShell中数组切片$fileContents[$bytesTransferred..($bytesTransferred + $bufferSize - 1)]在最后一块时可能超出数组长度,引发错误。未释放MemoryStream资源
创建的MemoryStream未调用Dispose(),存在资源泄漏风险。
修正后的代码
function Upload-FileResource { param ( [Object] $vault, [string] $filename, [byte[]] $fileContents ) $headerObject = New-Object Autodesk.Connectivity.WebServices.FileTransferHeader $headerObject.Identity = New-Guid $headerObject.Extension = [System.IO.Path]::GetExtension($filename) $headerObject.Vault = $vault.WebServiceCredentials.VaultName $uploadTicketBytes = @() $bytesTotal = if ($null -ne $fileContents) { $fileContents.Length } else { 0 } $bytesTransferred = 0 do { $bufferSize = $bytesTotal - $bytesTransferred if ($bufferSize -gt (49 * 1024 * 1024)) { $bufferSize = 49 * 1024 * 1024 } # 处理数组切片边界,避免越界 $endIndex = [Math]::Min($bytesTransferred + $bufferSize - 1, $bytesTotal - 1) $buffer = $fileContents[$bytesTransferred..$endIndex] $headerObject.Compression = "None" $headerObject.IsComplete = ($bytesTransferred + $bufferSize) -ge $bytesTotal $headerObject.UncompressedSize = $buffer.Length # 使用using块自动释放MemoryStream using ($fileContentsStream = [System.IO.MemoryStream]::new($buffer)) { # 传入headerObject到UploadFilePart $partTicket = $vault.FilestoreService.UploadFilePart($fileContentsStream, $headerObject) $uploadTicketBytes += $partTicket.Bytes } $bytesTransferred += $buffer.Length } while ($bytesTransferred -lt $bytesTotal) $uploadTicket = New-Object Autodesk.Connectivity.WebServices.ByteArray $uploadTicket.Bytes = $uploadTicketBytes return $uploadTicket } $fileContents = [System.IO.File]::ReadAllBytes($localPath) $uploadTicket = Upload-FileResource -vault $vault -filename $fileName -fileContents $fileContents
额外排查步骤
- 确认Vault服务端版本与客户端API版本完全匹配,版本不一致易引发此类异常
- 检查本地文件路径权限,确保执行脚本的账号有文件读取权限
- 验证
$vault会话是否有效,确认FilestoreService已正确初始化 - 先尝试上传小文件(小于49MB),排除分块逻辑之外的问题
内容的提问来源于stack exchange,提问作者Mr.Sha
相关产品推荐
相关产品推荐

