我正在尝试将文件作为附件上传到我的 Frappe 实例并遇到了几个问题。其中第一个是相关的,并且记录了填充错误:in this question。我把它包括在这里,以防它在某种程度上是我所犯错误的一部分。
我的第二个问题,这个问题的重点是,当我上传附件时,它们似乎已损坏。可以打开一个小的 xml 文件,但大部分是乱码。更大的 PDF 文件甚至无法打开。我的假设是我在使用 base64 编码时犯了某种初学者错误。
从本地 URL 获取数据:
let settingsLocation = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("SettingsList.plist")
let fileData = try Data.init(contentsOf: settingsLocation)
然后将其传递给以下函数:
public func attachFileToCloudResource(resourceType: String, resourceName: String, attachment: Data) {
let fileAsString = (attachment.base64EncodedString().replacingOccurrences(of: "+", with: "%2B") + "==")
var request = URLRequest(url: URL(string: FRAPPE_INSTANCE + FRAPPE_METHODS + FRAPPE_UPLOAD_ATTACHMENT)!)
var components = URLComponents(url: request.url!, resolvingAgainstBaseURL: false)!
components.queryItems = [
URLQueryItem(name: FRAPPE_DOCTYPE, value: resourceType),
URLQueryItem(name: FRAPPE_DOCNAME, value: resourceName),
URLQueryItem(name: FRAPPE_FILENAME, value: "testFile.xml"),
URLQueryItem(name: FRAPPE_DATA, value: fileAsString),
URLQueryItem(name: FRAPPE_PRIVATE, value: "1"),
URLQueryItem(name: FRAPPE_DECODE_BASE64, value: "1")
]
let query = components.url!.query
request.httpMethod = "POST"
request.addValue("token \(API_KEY):\(API_SECRET)", forHTTPHeaderField: "Authorization")
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpBody = Data(query!.utf8)
// url session and dataTask send data to server below this point
}
这可以正常工作,因为我从服务器获得了肯定的响应,并且文件附加到指定的记录 - 但是当文件被下载(通过网络浏览器)时,无论我尝试什么类型的文件,它似乎都已损坏。
任何帮助将非常感激。