2016-12-19 16 views
2

Alamofire 4.0を使用してIOS Swift 3からSqliteデータベースをアップロードしようとしましたが、アップロードに必要なデータタイプにsqliteファイルを変換する際に問題があります。Alamofire v4、Swift v3ドメインに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 
    } 
} 

私は苦労してる部分は、アップロード(multipartFormData.append(.........にsqliteのファイルを追加することです。.. ?)私は検索しましたが、参考文献は見つかりませんでした。

はい、私はnewbeんだけど、努力して、任意の助けをいただければ幸いです... ..

答えて

2

これは、MIMEタイプがapplication/octet-streamになることを除き、画像の例とまったく同じです。

また、先にDataにロードするのではなく、fileURLから直接ロードしてください。

この例のparametersは、画像自体のアップロードで提供されるファイル名に冗長に見えるため、あまり意味をなさないものです。したがって、Webサービスに必要なパラメータがあればそれを使用します。追加のパラメータがない場合は、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"; 
} 
+0

助けてくれてありがとう、私はすべてうまくいくと思ったが、急いで私はサーバー上の間違ったディレクトリを読んだ。ファイルはアップロードされていません。リンゴのコードはすべてよく見えますが、 – maper1

+0

これはマルチパートリクエストを作成するための適切なAlamofireコードです。私がそれをすると、私は進行状況を見て、私のサーバー上に表示されます。私は、サーバーコードとクライアントコードの切断を疑うでしょう。サーバーコードを見ることなく、私はさらにあなたに助言することができません。 – Rob

+0

サーバprobのようですが、ファイルがアンドロイドで動作していて、swiftv2(SRwebclientを使用していました)もありました "progress.fraction"が完了しました。0.01322の値に何回か印字されています。 : 私はupload.responseに追加: .request .response .DATA .result .timeline与える: オプション( {URL:HTTP://mydomain/fileup.aspx} {ステータス"Content-Type" = "text/html"; "X-AspNet-Version" = "4.0.30319"; オプション(6411バイト) FAILURE - 何か助けてください? – maper1

関連する問題