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( URL: mydomain/fileup.aspx status code: 500, headers "Cache- Control" = private; Connection = close; "Content-Type" = "text/html"; "X-AspNet-Version" = "4.0.30319"; 可选(6411 字节)失败 - 有什么帮助吗? 服务器期望的内容以及这个多部分请求的形成方式可能只是一些断开连接。我们不能仅通过查看您收到的回复来诊断这一点(尽管如果您查看回复正文的文本,这将提供线索)。也许编辑问题以包含 Android 代码。或者分享服务器代码。或者使用像 Charles 或 Wireshark 这样的嗅探器来检查一个格式良好的 android 请求是什么样的。但这里还不足以诊断。 我在尝试上传 SQLite 文件时一定做错了,因为它失败了。但是,我使用此代码成功上传了图像文件和文本文件(更改了 mimetype)。一切正常,包括用于文件名和文件夹名的参数。 .net ASP 页面完全按照预期处理它们。但是,SQLite 文件总是失败。我发现了一篇关于 mimetype "application/x-sqlite3" 的帖子,但这也失败了。任何建议表示赞赏?谢谢

以上是关于Alamofire v4,Swift v3 将 Sqlite 文件上传到域的主要内容,如果未能解决你的问题,请参考以下文章

GoogleDrive + Alamofire:上传带有属性的文件

如何将IPython v3笔记本转换为Jupyter v4?

D3 树图 v3 到 v4

如何使用 Alamofire 发布嵌套的 JSON?

Swift:cUrl 等效 Alamofire 请求

使用Javascript中的Oauth授权将Google表格API v3迁移到v4之后如何实现makeApiCall()方法