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

时间:2018-04-04 04:19:39

标签: ios iphone swift xcode

因此,我正在制作的应用程序会创建一个名为" 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"的双引号之间,我尝试了上一段中列出的两个文件路径以及文件名,但我得到的值为零找到的文件。该文件未被识别出来,可能是因为我使用的文件路径错误,因为Alamofire在尝试定位发送文件时返回nil。任何人都知道我应该使用的直接文件路径能够抓取我的文件,因为其他两个不应该工作吗?谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

请注意,我根据您在答案中粘贴的路径进行猜测,并将其放入应用程序的文档目录中。这是一个非常好的地方放置这种类型的东西,但如果我错了,你把它放在一个不同的地方,你将不得不修改这个代码指向正确的地方