1

私は長い時間を検索しましたが、これを行う方法については適切なリソースが見つかりませんでした。 apiは、1つのフォームパラメータ "user_id" (現在urlpathはフォームパラメータではない)をとビデオファイル用の "file"として送信します。 URLSessionタスクまたはiOS用ライブラリを使用して、いくつかのコードサンプルを提供してください。Swift3ビデオファイルをアップロードしてもう1つのフォームパラメータ(フォームからスキップしてURLパスとして送信できます)

Alamofireをしようとしました:

Alamofire.upload(multipartFormData: { (multipartFormData) in 
     multipartFormData.append(self.fileurl, withName: "file") 
    }, to:"http://www.www.www/upload/8590", 
     headers: ["Authorization": "Bearer \(SharedPreferences.preferences.getKeyValue(key: Constants.AUTH_TOKEN_key))"]) 
    { (result) in 
     switch result { 
     case .success(let upload, _ , _): 

      upload.uploadProgress(closure: { (progress) in 

       print("uploding>>>>>>") 
      }) 

      upload.responseJSON { response in 
       print(response) 
       print("done") 

      } 

     case .failure(let encodingError): 
      print("failed") 
      print(encodingError) 

     } 

これは、UTF-8エンコーディングを使用してヘッダーの最初のバイトを読み取ることができないと言って、サーバーから500をスローします。

message = "An Error OccuredInvalid header string: 'utf8' codec can't decode byte 0x9b in position 1: invalid start byte"; 
result = "Traceback (most recent call last):\n File \"/var/www/wb_ios/wb_app/views.py\", line 94, in post\n user_auth = jwt_decode_handler(auth).get('sub')\n File \"/usr/local/lib/python2.7/dist-packages/rest_framework_jwt/utils.py\", line 104, in jwt_decode_handler\n unverified_payload = jwt.decode(token, None, False)\n File \"/usr/local/lib/python2.7/dist-packages/jwt/api_jwt.py\", line 70, in decode\n payload, signing_input, header, signature = self._load(jwt)\n File \"/usr/local/lib/python2.7/dist-packages/jwt/api_jws.py\", line 177, in _load\n raise DecodeError('Invalid header string: %s' % e)\nDecodeError: Invalid header string: 'utf8' codec can't decode byte 0x9b in position 1: invalid start byte\n"; 
status = 500; 

}

また、私は正常に映像を送信するために郵便配達を使用することができます。イメージに示すようなフォームデータフィールドを使用する。 body Headers

ついに私も試してみました:

let url = NSURL(string: "http://www.www.www/upload/8590") 
    let request = NSMutableURLRequest(url: url! as URL) 
    let boundary = "------------------------your_boundary" 

    request.httpMethod = "POST" 
    request.setValue("ios", forHTTPHeaderField: "client") 
    request.setValue(Constants.AUTH_KEY, forHTTPHeaderField: Constants.AUTH_KEY_key) 
    request.setValue("Bearer " + SharedPreferences.preferences.getKeyValue(key: Constants.AUTH_TOKEN_key)!, forHTTPHeaderField: Constants.AUTH_AUTHORIZATION_key) 
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 
    var movieData: NSData? 
    do { 
     movieData = try NSData(contentsOfFile: fileurl.path, options: NSData.ReadingOptions.alwaysMapped) 
     print(movieData) 
    } catch _ { 
     movieData = nil 
     return 
    } 

    let body = NSMutableData() 

    // change file name whatever you want 
    let filename = "upload.mov" 
    let mimetype = "video/mov" 

    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!) 
    body.append("Content-Disposition:form-data; name=\"file\"; filename=\"\(filename)\"\r\n".data(using: String.Encoding.utf8)!) 
    body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!) 
    body.append(movieData! as Data) 
    request.httpBody = body as Data 

    let session = URLSession.shared 
    let task = session.dataTask(with: request as URLRequest) { 
     (data, response, error) in 

     guard let _:NSData = data as! NSData, let _:URLResponse = response, error == nil else { 
      print("error") 
      return 
     } 

     let dataString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
     print(dataString) 
    } 

    task.resume() 

これはまた、このようなエラーがスローされます。第二の試験で

{"status":500,"message":"An Error Occuredu'file'","result":"Traceback (most recent call last):\n File \"/var/www/wb_ios/wb_app/views.py\", line 104, in post\n file_obj = request.data['file']\n File \"/usr/local/lib/python2.7/dist-packages/django/utils/datastructures.py\", line 85, in __getitem__\n raise MultiValueDictKeyError(repr(key))\nMultiValueDictKeyError: \"u'file'\"\n"}) 
+0

をple(URLSession)サーバーはフォームデータのファイル名を期待していませんが、私は何の違いもないと思います。 フォームを正しくアップロードできなかった場合、サーバーは辞書を正しく読み取れません。 –

答えて

0

Swift3.0

Alamofire.upload(multipartFormData: { MultipartFormData in 
      for (key, value) in parameter { 
       MultipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key) 
      } 

// here you can upload only mp4 video 
       multipartFormData.append(self.fileurl!, withName: "file", fileName: "video.mp4", mimeType: "video/mp4") 
// here you can upload any type of video    
       multipartFormData.append((self.fileurl.data(using: String.Encoding.utf8, allowLossyConversion: false))!, withName: "File") 

      print(MultipartFormData) 
     },to:"http://www.www.www/upload/8590",headers: ["Authorization": "Bearer \(SharedPreferences.preferences.getKeyValue(key: Constants.AUTH_TOKEN_key))"] 
      ) 
     { (result) in 

      switch result { 
      case .success(let upload, _, _): 
       upload.uploadProgress(closure: { (progress) in 
        print("Upload Progress: \(progress.fractionCompleted)") 
       }) 
       upload.responseJSON { response in 
        print(response.result.value ?? String()) 
        print(response.data ?? NSData()) 
        // send to completion block 
        completion(response.data as AnyObject? ?? NSData()) 
       } 

      case .failure(let encodingError): 
       print(encodingError) 
       errorOccured(encodingError as NSError?) 

      } 
     } 
+0

のmultipartFormData.append(( "VIDEO" .data(String.Encoding.utf8、allowLossyConversion:false))!, withName: "Type") 「ビデオ」とは何ですか? –

+0

ビデオのur urlを追加するには、この multipartFormData.append(self.fileurl !, withName: "file"、fileName: "video.mp4"、mimeType: "video/mp4")を使用し、その行にコメントしてください。それが動作するかどうか私に教えてください。 –

+0

私はipadのためのアプリを構築した後、私はビルドの失敗にうんざりしています。 iOSがAndroidよりも面倒であるとは思わなかった。できるだけ早く結果を投稿します。 –

関連する問題