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

Posted

技术标签:

【中文标题】GCDWebServer:如何更改服务器上的文件权限以进行 WebDAV 操作? (iOS)【英文标题】:GCDWebServer: How do I change file permissions on server for WebDAV operations? (iOS) 【发布时间】:2021-05-25 07:00:56 【问题描述】:

我目前正在尝试使用 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)

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于GCDWebServer:如何更改服务器上的文件权限以进行 WebDAV 操作? (iOS)的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 GCDWebServer 在 iOS 上播放本地 M3u8 文件

tvOS 上的 GCDWebServer

GCDWebserver 监听 HTTP POST

剪辑显示如何配置和使用 GCDwebserver

如何向 GCDWebServer 请求发送两个响应

如何限制连接到 GCDWebServer 中允许的 IP