GCDWebServer:如何为 WebDAV 操作更改服务器上的文件权限? (iOS)

GCDWebServer: How do I change file permissions on server for WebDAV operations? (iOS)

我目前正在尝试使用 GCDWebServer 托管应用程序启动时 WKWebView 请求的本地网页。我希望能够在应用程序 运行 时通过使用 UIDocumentPickerViewController 抓取文件将外部文件上传到服务器。似乎在不同的端口上使用单独的 GCDWebDAVServer 是个好主意。

但是,如果我尝试将文件上传到 WebDAV 服务器,我会从响应中获取以下数据:

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><title>HTTP Error 500</title></head><body><h1>HTTP Error 500: Failed moving uploaded file to &quot;/arbitrary.txt&quot;</h1><h3>[NSCocoaErrorDomain] “35B890AC-7CD2-4A10-A67F-BAED3D6C34AB-3278-000005593C778876” couldn’t be moved because you don’t have permission to access “www”. (513)</h3></body></html>

为了便于阅读,删除了这一点:

Failed moving uploaded file to &quot;/arbitrary.txt&quot;</h1><h3>[NSCocoaErrorDomain] “35B890AC-7CD2-4A10-A67F-BAED3D6C34AB-3278-000005593C778876” couldn’t be moved because you don’t have permission to access “www”.

www 在此上下文中是我使用 GCDWebServer 提供的本地文件夹。它没有子文件夹,只有文件。

这是我在 viewDidLoad 中使用的代码:

let webContentUrl = Bundle.main.path(forResource: "www", ofType: nil)!
httpServer = GCDWebServer()
        
webDAVURL = "http://localhost:\(WEBDAV_PORT)/"
webDAVServer = GCDWebDAVServer(uploadDirectory: webContentUrl)
        
httpServer.addGETHandler(forBasePath: "/", directoryPath: webContentUrl, indexFilename: "index.html", cacheAge: 3600, allowRangeRequests: true)
httpServer.start(withPort: HTTP_PORT, bonjourName: nil)
        
let options: [String: Any] = [
    GCDWebServerOption_Port: WEBDAV_PORT
]

do {
    try webDAVServer.start(options: options)
} catch let error {
    print("Could not start WebDAV server. Reason: \(error.localizedDescription)")
}
        
let request = URLRequest(url: URL(string: "http://localhost:\(HTTP_PORT)/")!)
webView.load(request)

以及用于将文件上传到 WebDAV 服务器的 PUT 请求的代码:

let importedFileUrl = urls.first!

do {
    let data = try Data(contentsOf: importedFileUrl)

    var request = URLRequest(url: URL(string: "http://localhost:\(WEBDAV_PORT)/arbitrary.txt")!)
    request.httpMethod = "PUT"

    let task = URLSession(configuration: .ephemeral).uploadTask(with: request, from: data) { data, response, error in
        print("Data: \(String(describing: data))")
        print("Response: \(String(describing: response))")
        print("Error: \(String(describing: error))")
        print(String(decoding: data!, as: UTF8.self))
    }

    task.resume()

} catch let error {
    createErrorAlert(message: error.localizedDescription)
}

这与iOS14 本地网络隐私功能没有任何关系。我尝试修改 Info.plist 以包含新键,但没有任何改变。 www 文件夹似乎没有写入权限。

是否有我缺少的功能可以让您更改 GCDWebServer 中的文件权限,或者是否有解决方法?现在我能想到的唯一解决方法是在网络服务器旁边创建一个本地数据库。

不允许写入权限的原因是因为我直接从应用程序包提供文件,无法写入。

我的解决方案是将该目录的内容复制到 Documents 目录,然后改用 WebDAV 写入该目录。