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 "/arbitrary.txt"</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 "/arbitrary.txt"</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)的主要内容,如果未能解决你的问题,请参考以下文章