Загрузить изображения Multipart с Мойя Swift Полностью пример

Как загрузить изображение с помощью multipart/form-data в Swift With Moya

мой код

var multipartBody: [MultipartFormData]? {
    switch self {
    case .registerWith(let registrationObject ):
        if let profileImageData = registrationObject.profileImageData{
        return [MultipartFormData(provider: .data(profileImageData), name: "profile_picture", fileName: "\(registrationObject.phone).jpg",
            mimeType: "image/jpeg")]
        }
        return nil
    default:
        return nil
    }
}

var task: Task {
    switch self {
    case .registerWith:
        if let multipartBody = multipartBody {
            return .upload(.multipart(multipartBody))
        }else{
            return .request
        }
    default:
        return .request
    }
}

но мне нужно отправить imageData в теле с ключом "profileImage"

3 ответа

Чтобы загрузить изображение в Multipart, используя Moya версии 10.0.0 и выше

1- Поместите файлы, которые вы хотите загрузить в массив MultipartFormData

// put files in MultipartFormData Arry  
   var multipartBody :[Moya.MultipartFormData]?{
    switch self {
    case .registerWith(let imageData , let name ,let description  ):
        // any additional body data or body parms
        let nameDataProvider = MultipartFormData(provider: .data(name.data(using: .utf8)!), name: "name")
        let emailDataProvider = MultipartFormData(provider: .data(email.data(using: .utf8)!), name: "email")
        // image want to upload it or file as a MultipartFormData
        let imageDataProvider = Moya.MultipartFormData(provider: MultipartFormData.FormDataProvider.data(imageData), name: "avatar", fileName: "photo.jpg", mimeType: "image/jpeg")
            return [ imageDataProvider , descriptionDataProvider ]
    default:
        return []
    }
}

2- сделать тип задачи этого метода - uploadMultipart

var task: Task {
    switch self {
    case .registerWith:
        // for each method multi part use its multipartBody that declared it in step one needed
        return .uploadMultipart(multipartBody!)
    default:
        guard let parameters = self.parameters else {
            return .requestPlain
        }
        return .requestParameters(parameters: parameters.values, encoding: parameters.encoding)
    }
}

Чтобы загрузить изображение в Multipart, используя Moya версии 9.0.0 и ниже

1- Поместите файлы, которые вы хотите загрузить в массив MultipartFormData

// put files in MultipartFormData Arry  
var multipartBody: [MultipartFormData]? {
     switch self {
          case .registerWith(let imageData , let name ,let description  ):
              return [MultipartFormData(provider: .data(imageData),
             name: "profile_picture", fileName: "fileName", mimeType: "image/jpeg")]
              default:
               return nil
       } 
}

2- Добавьте провайдера multipartBody в тело запроса того метода, который вам нужен

var parameters: [String: Any]? {
     switch self {
          case .registerWith(let registrationObject ):
          var body = registrationObject.toJSON()!
          // add the file in body 
          body["profile_picture"] = multipartBody?[0].provider
          return body
     }
}

3- сделать тип задачи этого метода - загрузить

var task: Task {
       switch self {
           case .registerWith:
              //  multipartBody that in First step
             return .upload(.multipart(multipartBody))
        }
}

Hear - это код для загрузки изображения с использованием Moya версии 10.0.2.

//MARK:- MultipartData -
var multipartBody :[Moya.MultipartFormData]?{
    switch self {
    case .addUser(let userInfo):

        //other parameters need to convert to data
        let vName = userInfo.name
        let vNameData = Moya.MultipartFormData(provider: MultipartFormData.FormDataProvider.data(vName.data(using: .utf8)!), name: "vName")

        //convert your image to data
        guard let data = UIImageJPEGRepresentation(userInfo.profilePic, 1.0) else { return nil }

         return [Moya.MultipartFormData(provider: MultipartFormData.FormDataProvider.data(data), name: "vAvtarName", fileName: "photo.jpg", mimeType: "image/jpeg"),vNameData]
    default:
        return []
    }
}

var task: Task {
    switch self {
        case .addUser(let userInfo):
        return .uploadMultipart(self.multipartBody!)
    }
}

Вам нужно изменить "name: "profile_picture"" на "name: "profileImage"", попробуйте это.

Другие вопросы по тегам