李给你的东西在正确的轨道上,杰克。有几件事你可以做,但你想改变。
首先 - 由于您使用的是相对 URL,请将其作为参数添加到函数中。这是您的文档库名称之后的 URL 部分(即 /sub-folder/sub-folder):
Function UploadFileInSlice ($ctx, $libraryName, $fileName, $FolderRelativeURL)
然后 - 创建一个变量来构建您的目标 URL(记得替换空格,并删除逗号:
$targetURL = "/sites/dev/$($libraryName.Replace(',','').Replace(' ','%20'))$($FolderRelativeURL.Replace(' ','%20'))"
下一步 - 由于您使用的是相对 URL,因此无需加载根文件夹。您仍然可以使用其相对 URL 上传到它。但是,您将希望您的上下文在以后知道目标文件夹。所以在函数开始之前,你只需要这 4 行来设置你的上下文:
$web = $ctx.web
$folder = $web.GetFolderByServerRelativeUrl($targetURL)
$ctx.Load($folder)
$ctx.ExecuteQuery()
Lee 在“常规方法”中提供的位适用于小于块大小的文件,但在大文件部分,您希望使用该 $upload 对象。您需要该对象才能让其余代码上传切片。与您的原始来源和 Lee 的回答相比,这应该看起来很熟悉:
$Upload = $folder.Files.Add($fileInfo)
最后 - 在第一个切片(空文件)上传后,您需要更改 $upload 对象的引用。原始代码仍在查看文件的根目录。您必须将其定向到您的相对 URL。由于您之前已将文件夹加载到上下文中,因此您可以检索所需的属性(在本例中,您将获得其 ServerRelativeUrl):
$Upload = $ctx.Web.GetFileByServerRelativeUrl($folder.ServerRelativeUrl + [System.IO.Path]::AltDirectorySeparatorChar + $UniqueFileName);
我有构建 2 个不同 URL 的脚本的原因是因为 $web.GetFolderByServerRelativeUrl 想要一个 Web URL(这意味着 %20 而不是空格并且没有逗号),而 $ctx.Web.GetFileByServerRelativeUrl 想要一个直接 URL(它可以有空格;它不喜欢带有 %20 的 URL)。您可能没有这个问题,并且可以跳过其中的一些代码。然而,我的用户对我并不友善,并且尽可能使用空格。
最后一点,您可能希望在“常规方法”部分的“返回”之前添加 $Filestream.dispose()。没有它,该文件将被锁定,直到脚本结束,如果需要,您以后无法访问/修改它。
我希望这对您有所帮助。我也不得不在互联网上搜索如何将大文件上传到子目录中。