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



因此,我正在制作的应用程序创建一个名为" 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")

在" foreResource"的双引号之间,我尝试了我在上一段中列出的两个文件路径,以及文件名,但我在任何一个找到的文件中都得到了零值。该文件未被认为存在,大概是因为我使用的文件路径是错误的,因为Alamofire试图找到发送文件时返回零。任何人都知道我应该用来抓住我的文件的直接文件路径,因为其他两个据说不起作用?谢谢!

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

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

如果您在运行时动态创建文件,则不会在您的应用程序包中,因此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
}

请注意,我猜是根据您在答案中粘贴的路径,将其放在应用程序文档目录中。这是一个非常好的地方,可以放置这种类型的东西,但是如果我错了,并且将其放在另一个地方,则必须修改此代码才能指向正确的位置

最新更新