Alamofire v4,Swift v3 将 Sqlite 文件上传到域
Posted
技术标签:
【中文标题】Alamofire v4,Swift v3 将 Sqlite 文件上传到域【英文标题】:Alamofire v4, Swift v3 Uploading Sqlite file to domain 【发布时间】:2016-12-19 17:50:24 【问题描述】:我正在尝试使用 Alamofire 4.0 从 ios Swift 3 将 Sqlite 数据库上传到我的服务器,但在将 sqlite 文件转换为上传所需的数据类型时遇到问题。
大多数帖子/问题示例似乎默认上传图片,但我正在努力寻找上传 sqlite 或其他文件类型的示例(用于备份目的)
我已经搜索了基本代码,发现到目前为止看起来非常合理(感谢以下帖子:Alamofire 4 upload with parameters)
let parameters = ["file_name": "swift_file.jpeg"]
Alamofire.upload(multipartFormData: (multipartFormData) in
multipartFormData.append(UIImageJPEGRepresentation(self.photoImageView.image!, 1)!, withName: "photo_path", fileName: "swift_file.jpeg", mimeType: "image/jpeg")
for (key, value) in parameters
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
, to:"http://sample.com/upload_img.php")
(result) in
switch result
case .success(let upload, _, _):
upload.uploadProgress(closure: (progress) in
//Print progress
)
upload.responseJSON response in
//print response.result
case .failure(let encodingError):
//print encodingError.description
我正在努力的部分是将 sqlite 文件附加到上传文件(multipartFormData.append(……..?) 我已经搜索但没有找到任何好的参考帖子。
是的,我是新手,但努力工作,任何帮助将不胜感激........
【问题讨论】:
【参考方案1】:它与图像示例完全相同,只是 mime 类型为application/octet-stream
。
另外,您可能会直接从fileURL
加载它,而不是先将其加载到Data
。
顺便说一句,该示例中的parameters
不太有意义,因为它看起来与上传图像本身时提供的文件名是多余的。所以你可以使用你的网络服务需要的任何参数,如果有的话。如果您没有其他参数,您只需完全省略 for (key, value) ...
循环。
最后,显然将 file
字段名称替换为您的 Web 服务正在寻找的任何字段名称。
// any additional parameters that must be included in the request (if any)
let parameters = ["somekey": "somevalue"]
// database to be uploaded; I'm assuming it's in Documents, but perhaps you have it elsewhere, so build the URL appropriately for where the file is
let filename = "test.sqlite"
let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
.appendingPathComponent(filename)
// now initiate request
Alamofire.upload(multipartFormData: multipartFormData in
multipartFormData.append(fileURL, withName: "file", fileName: filename, mimeType: "application/octet-stream")
for (key, value) in parameters
multipartFormData.append(value.data(using: .utf8)!, withName: key)
, to: urlString) result in
switch result
case .success(let upload, _, _):
upload
.authenticate(user: self.user, password: self.password) // only needed if you're doing server authentication
.uploadProgress progress in
print(progress.fractionCompleted)
.responseJSON response in
print("\(response.result.value)")
case .failure(let encodingError):
print(encodingError.localizedDescription)
不相关,但如果您不确定要使用哪种 mime 类型,您可以使用此例程,它将尝试根据文件扩展名确定 mime 类型。
/// Determine mime type on the basis of extension of a file.
///
/// This requires MobileCoreServices framework.
///
/// - parameter url: The file `URL` of the local file for which we are going to determine the mime type.
///
/// - returns: Returns the mime type if successful. Returns application/octet-stream if unable to determine mime type.
func mimeType(for url: URL) -> String
let pathExtension = url.pathExtension
if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as NSString, nil)?.takeRetainedValue()
if let mimetype = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue()
return mimetype as String
return "application/octet-stream";
【讨论】:
感谢您的帮助,我认为一切正常,但我匆忙中读取了服务器上的错误目录。该文件没有被上传。苹果中的代码看起来都不错,但是 这是用于创建多部分请求的适当 Alamofire 代码。当我这样做时,我会看到进度并出现在我的服务器上。我怀疑服务器代码和客户端代码断开连接。在没有看到服务器代码的情况下,我不确定我是否可以为您提供进一步的建议。 它看起来确实像服务器问题,但文件正在与 android 一起使用并且也与 swiftv2 一起使用(正在使用 SRwebclient)完成的“progress.fraction”正在打印几次,值为 0.01322....然后报告“nil”:我添加到 upload.response: .request .response .data .result .timeline Giving: Optional(以上是关于Alamofire v4,Swift v3 将 Sqlite 文件上传到域的主要内容,如果未能解决你的问题,请参考以下文章
GoogleDrive + Alamofire:上传带有属性的文件
如何将IPython v3笔记本转换为Jupyter v4?
使用Javascript中的Oauth授权将Google表格API v3迁移到v4之后如何实现makeApiCall()方法