Retrofit 2 ne peut pas télécharger un fichier avec deux paramètres de chaîne distincts supplémentaires
Lire modifier au bas de la question pour une autre solution possible jusqu'à ce que la solution est trouvée.
C'est un post de fichier avec deux paramètres à l'aide de Facteur. Je suis en train de faire la même chose avec de rénovation, mais recevoir des BadRequest.
Facteur Paramètres:
Chrome Réseau Post Détails:
Maintenant, voici comment je le fais dans Android, mais à défaut:
Rénovation Interface De Service:
@Multipart
@POST("jobDocuments/upload")
Call<ResponseBody> upload(@Part("file") MultipartBody.Part file,@Part("folder") MultipartBody.Part folder,@Part("name") MultipartBody.Part name);
C'est mon @arrière-plan de la méthode à exécuter les requêtes de réseau de service ci-dessus généré
CustDataClient service =
ServiceGenerator.createService(CustDataClient.class);
File file = new File(fileUri.getPath());
//create RequestBody instance from file
RequestBody requestFile =
RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part fileData =
MultipartBody.Part.createFormData("file", fileName, requestFile);
MultipartBody.Part folder =
MultipartBody.Part.createFormData("folder", "LeadDocuments");
MultipartBody.Part name =
MultipartBody.Part.createFormData("name", fileName);
//finally, execute the request
Call<ResponseBody> call = service.upload(fileData,folder,name);
try {
Response<ResponseBody> rr = call.execute();
ResponseBody empJobDocsResult = rr.body();//Bad Request here :(
Log.v("Upload", "success");
} catch (Exception ex) {
Log.e("Upload error:", ex.getMessage());
}
Voici mon Api Web Méthode:
[Route("upload")]
[HttpPost]
public IHttpActionResult Upload()
{
if (HttpContext.Current.Request.Files.AllKeys.Any())
{
//Get the uploaded image from the Files collection
var httpPostedFile = HttpContext.Current.Request.Files["file"];
if (httpPostedFile != null)
{
//Validate the uploaded image(optional)
var folder = HttpContext.Current.Request.Form["folder"];
var fileName = HttpContext.Current.Request.Form["name"];
fileName = string.IsNullOrEmpty(fileName) ? httpPostedFile.FileName : fileName;
//Get the complete file path
var fileSavePath = Path.Combine(HttpContext.Current.Server.MapPath("~/Files/" + folder), fileName);
//Save the uploaded file to "UploadedFiles" folder
httpPostedFile.SaveAs(fileSavePath);
return Ok(new OkMessage { Message = "File uploaded successfully", Path = "/Files/" + folder + "/" + fileName });
}
}
return BadRequest("File not uploaded");
}
S'il vous plaît aider où je suis mal et comment y parvenir, est-il une alternative simple à la rénovation?
[Modifier]
Ce code fonctionne avec succès, Grâce à koush/ion:
Ion.with(getContext())
.load("POST", "http://www.dgheating.com/api/jobDocuments/upload")
.setMultipartParameter("folder", "LeadDocuments")
.setMultipartParameter("name", fileName)
.setMultipartFile("file", new File(imagePath))
.asJsonObject()
.setCallback(...);
source d'informationauteur ahmadalibaloch
Vous devez vous connecter pour publier un commentaire.
Donc, j'espère que c'est pas trop tard, et si on peut aider quelqu'un d'autre 🙂 mes 2 cents sur c'est après avoir eu le même problème tout à l'arrière:
La définition du service, à l'aide de
@Part
seulement (modifier les noms de champ en fonction de ce que votre serveur attend)Et pour le tour de magie, je me réfère aux deux parties tout comme
RequestBody
à l'aide de laMediaType.parse()
pour chacun avec son propre type, en s'appuyant sur la@Multipart
définition de la requête elle-même, pas besoin deform-data
trucs, les mêmes œuvres pour plusieurs fichiers, et de plusieurs champs:(J'utilise un auditeur de retour de la fonction de rappel de la réponse à une autre partie de l'application (par exemple, un appel de l'activité)).
Absolument, cela envoie le fichier/s et le champ de texte, d'autres problèmes tiennent probablement à partir du côté serveur.
Espérons que cette Aide!
À l'aide de Rénovation 2, vous devez utiliser OkHttp de RequestBody ou MultipartBody.Partie des catégories et encapsuler votre fichier dans un corps de la requête. Jetons un coup d'oeil à la définition de l'interface d'upload de fichiers.
Avez-vous vu https://futurestud.io/blog/retrofit-2-how-to-upload-files-to-server
J'ai fait face à problème similaire ici: Android avec Retrofit2 OkHttp3 - Multipart Erreur POST
J'ai obtenu mon problème est résolu après la prise de @TommySM suggestion. Si c'est pas encore clair pour vous, je pense que c'est la solution:
L'important, c'est d'utiliser
MediaType.parse("text/plain")
pourMediaType
de paramètre de Chaîne (je crois que votre cas est: dossier & nom du paramètre), à l'aide deokhttp3.MultipartBody.FORM
est une erreur.Voir ces captures d'écran pour la comparaison:
1) Problématique POST
2) Corriger POST
Interface de Rénovation (API)
Classe De Réponse (JsonResponse)
Les appels de l'API de l'application
Erreur dans les champs, à cause de ces problème de serveur
Il ressemble à la définition de votre service est mauvais. Essayez
et
dans votre @arrière-plan de la méthode. Tout cela suppose l'utilisation d'Retrofit2.