Przeczytaj edycję na dole pytania o możliwe alternatywne rozwiązanie, dopóki nie zostanie znalezione rozwiązanie.Retrofit 2 nie może załadować pliku z dwoma dodatkowymi osobnymi parametrami ciągów.
Jest to udany plik post z dwoma parametrami za pomocą POSTMan. Próbuję zrobić to samo z retrofitem, ale otrzymam BadRequest.
Ustawienia listonosz:
Chrome Network Szczegóły postu:
Teraz oto jak robię to w Androidzie, ale braku:
Retrofit Interfejs serwisowy:
@Multipart
@POST("jobDocuments/upload")
Call<ResponseBody> upload(@Part("file") MultipartBody.Part file,@Part("folder") MultipartBody.Part folder,@Part("name") MultipartBody.Part name);
To mój @Background sposób uruchomić żądanie sieciowe z powyższej usługi generowane
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());
}
Oto moja metoda Web API:
[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");
}
Proszę o pomoc, gdzie mylę się i jak to osiągnąć, czy jest jakaś łatwa alternatywa dla modernizacji?
[Edytuj] Kod ten działa skutecznie, dzięki 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(...);
miałem ten sam problem z Androidem, w celu być precyzyjne, z 4.1.1; Teraz, używając przykładu z jonem, problem został rozwiązany i teraz mogę bez problemu przesyłać pliki (obrazy w moim przypadku). Powinieneś opublikować edycję jonów jako odpowiedź (chyba). –
Nie, to nie jest rozwiązanie problemu, ale alternatywa (unikanie problemu). – ahmadalibaloch
to jest do bani. Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? –