为啥 URL 在存储然后从本地文件系统检索时会被截断?

Posted

技术标签:

【中文标题】为啥 URL 在存储然后从本地文件系统检索时会被截断?【英文标题】:Why does the URL get truncated when stored then retrieved from a local file system?为什么 URL 在存储然后从本地文件系统检索时会被截断? 【发布时间】:2018-09-01 19:32:47 【问题描述】:

我已经生成了一个具有以下功能的 URL。我想将此保存到本地文件夹以供以后使用。但是,当我将其保存到本地文件夹,然后检索它时,URL 被截断。请有人建议我如何保存和提取完整的 URL?

func createPhotoURL() -> URL 
    
    let fileName = "tempImage_wb.jpg"
    
    let documentsDirectories = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let documentDirectory = documentsDirectories.first!
    let pdfPageURL = documentDirectory.appendingPathComponent("\(fileName)")
    
    return pdfPageURL

当我调用该函数时,我会得到完整的 URL:

let imageURL = createPhotoURL() // CORRECT URL FOR FILE UPLAOD
print("imageURL: \(imageURL)")

控制台:

file:///var/mobile/Containers/Data/Application/CDDE2FED-5AAB-4960-9ACF-33E7B42D05AE/Documents/tempImage_wb.jpg

将上面的 URL 保存到本地文件夹并检索它:

UserDefaults.standard.set(imageURL, forKey: "URL_IMAGE")
guard let retrievedURL = UserDefaults.standard.string(forKey: "URL_IMAGE") elsereturn
print("retrievedURL: \(retrievedURL)")

控制台:

retrievedURL: ~/Documents/tempImage_wb.jpg

【问题讨论】:

~/ 是应用程序文档文件夹的简写 @Carpsen90 ~ ios 中的波浪号是 bundleURL Bundle.main.bundleURL的简写 【参考方案1】:

要回答您的问题,请使用 UserDefaults.standard.url 而不是 UserDefaults.standard.string

guard let retrievedURL = UserDefaults.standard.url(forKey: "URL_IMAGE") elsereturn

但这只有在您保存路径并在同一个会话中检索它时才有效。如果您使用上述代码并多次运行该应用程序,您将获得未截断的 url(如您所愿)。但是如果你检查得当,你会发现你实际上在不同的会话中得到了不同的 url。

因此您不应该将其保存为 URL,而应将其保存为字符串。为此,您可以使用 URL 的 absoluteString 属性

let imageURL = createPhotoURL()
print("imageURL: \(imageURL)")
UserDefaults.standard.set(imageURL.absoluteString, forKey: "URL_IMAGE")

要检索,您将首先从 UserDefaults 中检索保存的字符串,然后将其转换为 URL

if let urlString = UserDefaults.standard.string(forKey: "URL_IMAGE"),
    let retrievedURL = URL(string: urlString) 

    print("retrievedURL: \(retrievedURL)")

【讨论】:

您不应该建议保存整个字符串 url。 OP应该只保存目录和文件名并相应地重建url 请注意,不能保证 url 字符串在不同的构建之间不会改变 感谢@LeoDabus 提醒我。我已经做出了改变

以上是关于为啥 URL 在存储然后从本地文件系统检索时会被截断?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这不能检索 Firebase 存储上图像的下载 URL?

为啥我收到错误此驱动程序不支持使用 cloudinary-laravel 检索 URL?

为啥“git clone”在传递本地 file:/// url 时会打包对象数据库?

为啥 Docker 容器在启动时会被静默删除

如何按照我们设置的顺序从本地存储中检索数据

为啥某些方程中的某些常数的符号在我们将其赋值为 1 时会被消除?