如何正确引用/检索在 AppData 中创建的临时文件以将文件上传到服务器?

Posted

技术标签:

【中文标题】如何正确引用/检索在 AppData 中创建的临时文件以将文件上传到服务器?【英文标题】:How to correctly reference/retrieve a temp file created in AppData for file upload to a server? 【发布时间】:2018-04-04 04:19:38 【问题描述】:

所以我正在制作的应用程序创建了一个名为“logfile”的文件,我试图通过 Alamofire 上传将该文件发送到服务器。控制台日志中打印的文件路径为

/var/mobile/Containers/Data/Application/3BE13D78-3BF0-4880-A79A-27B488ED9EFE/Documents/logfile.txt

我可以用来手动访问在 .xcappdata 中创建的日志的文件路径是

/AppData/Documents/logfile.txt

要访问它,我正在使用

let fileURL = Bundle.main.url(forResource: "", withExtension: "txt")

在“forResource”的双引号之间,我已经尝试了我在上一段中列出的两个文件路径以及文件名,但我得到的文件的值为 nil。无法识别该文件存在,大概是因为我使用的文件路径错误,因为 Alamofire 在尝试定位发送文件时返回 nil。任何人都知道我应该用来获取我的文件的直接文件路径,因为其他两个不应该工作?谢谢!

【问题讨论】:

您是在运行时在应用程序的文档目录中动态创建文件,还是预先安装在您的应用程序包中? 文件是在用户按下按钮生成文件时动态创建的 【参考方案1】:

使用下面的代码从文本文件中获取字符串数据上传到服务器:

let fileName = "logfile"
let documentDirURL = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)

let fileURL = documentDirURL.appendingPathComponent(fileName).appendingPathExtension("txt")
print("FilePath: \(fileURL.path)")

var readString = "" // Used to store the file contents
do 
    // Read the file contents
    readString = try String(contentsOf: fileURL)
 catch let error as NSError 
    print("Failed reading from URL: \(fileURL), Error: " + error.localizedDescription)

print("File Text: \(readString)") // Send 'readString' to server

【讨论】:

【参考方案2】:

如果您在运行时动态创建文件,它不会在您的应用程序包中,因此Bundle 类将无法找到它。您看到的目录也是动态生成的,不仅特定于平台,而且特定于设备,因此您不能直接使用文件路径。相反,您必须在运行时从 FileManager 类中请求正确的目录,如下所示:

guard let documents = FileManager.default.urls(for: .documentsDirectory, in: .userDomainMask).first else
    // This case will likely never happen, but forcing anything in Swift is bad
    return


let logURL = URL(string: "logfile.txt", relativeTo: documents)

do
    let fileContents = String(contentsOf: logURL)
    // Send your file to your sever here
catch
    // Handle any errors you might've encountered

请注意,我根据您在答案中粘贴的路径猜测您将其放入应用程序的文档目录中。这是放置这类东西的绝佳位置,但如果我错了,你把它放在不同的地方,你将不得不修改这段代码以指向正确的地方

【讨论】:

以上是关于如何正确引用/检索在 AppData 中创建的临时文件以将文件上传到服务器?的主要内容,如果未能解决你的问题,请参考以下文章

在 Terraform 中,如何在包含的模块中引用根模块中创建的组件

当我引用其他表时,如何保存在 Access 2003 中的表单中创建的数据?

如何在 ARM 模板中引用在 Azure 门户中创建的现有存储账户?

光标检索在 plpgsql 函数中创建的表中已删除的行

引用在 AppDelegate 中创建的 NSPersistentStore 实例

有啥方法可以返回对函数中创建的变量的引用?