Estou tentando fazer um HTTP POST para o servidor usando o Retrofit 2.0
MediaType MEDIA_TYPE_TEXT = MediaType.parse("text/plain");
MediaType MEDIA_TYPE_IMAGE = MediaType.parse("image/*");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
imageBitmap.compress(Bitmap.CompressFormat.JPEG,90,byteArrayOutputStream);
profilePictureByte = byteArrayOutputStream.toByteArray();
Call<APIResults> call = ServiceAPI.updateProfile(
RequestBody.create(MEDIA_TYPE_TEXT, emailString),
RequestBody.create(MEDIA_TYPE_IMAGE, profilePictureByte));
call.enqueue();
O servidor retorna um erro dizendo que o arquivo não é válido.
Isso é estranho, porque tentei carregar o mesmo arquivo com o mesmo formato no iOS (usando outra biblioteca), mas ele é carregado com êxito.
Pergunto-me qual é a maneira correta de carregar uma imagem usando o Retrofit 2.0 ?
Devo salvá-lo no disco antes de fazer o upload?
PS: Eu usei o retrofit para outra solicitação Multipart que não inclui imagem e eles foram concluídos com êxito. O problema é quando estou tentando incluir um byte no corpo.
android
retrofit
androidhttpclient
retrofit2
JayVDiyk
fonte
fonte
Respostas:
Estou destacando a solução em 1.9 e 2.0, pois é útil para alguns
Em
1.9
, acho que a melhor solução é salvar o arquivo em disco e usá-lo como arquivo digitado, como:RetroFit 1.9
(Eu não sei sobre a implementação do servidor) tem um método de interface API semelhante a este
E use-o como
Para RetroFit 2 Use o seguinte método
RetroFit 2.0 (esta foi uma solução alternativa para um problema no RetroFit 2 que foi corrigido agora, para o método correto, consulte a resposta de jimmy0251 )
Interface da API:
Use-o como:
fonte
@Multipart @POST("/api/Accounts/editaccount") Call<User> editUser(@PartMap Map<String, RequestBody> params);
e quando você tem o arquivo:Map<String, RequestBody> map = new HashMap<>(); RequestBody fileBody = RequestBody.create(MediaType.parse("image/jpg"), file); map.put("file\"; filename=\"" + file.getName(), fileBody);
MultiPartBody.Part
Existe uma maneira correta de fazer upload de um arquivo com seu nome no Retrofit 2 , sem qualquer invasão :
Defina a interface da API:
Carregar arquivo como este:
Isso demonstra apenas o upload de arquivos. Você também pode adicionar outros parâmetros no mesmo método com
@Part
anotação.fonte
MultipartBody.Part
argumentos na mesma API.@Part("images[]") List<MultipartBody.Part> images
mas dá erro que #@Part parameters using the MultipartBody.Part must not include a part name
@Body MultipartBody multipartBody
eMultipartBody.Builder
para enviar a coleção de imagens.Usei o Retrofit 2.0 para meus usuários cadastrados, enviei imagens / texto de arquivo com várias partes / formulário da conta registrada
Em meu RegisterActivity, use um AsyncTask
E na minha classe Register.java é onde usar Retrofit com chamada síncrona
Na interface do RegisterService
Para a análise Utilities ofr InputStream response
fonte
Código de atualização para upload de arquivo de imagem no Retrofit2.0
Mude
MediaType.parse("image/*")
paraMediaType.parse("image/jpeg")
fonte
@Multipart
então@Part
a anotação deve fornecer um nome ou usar MultipartBody.Part tipo de parâmetro.@Part("profile_pic\"; filename=\"pp.png "
Adicionando à resposta dada por @insomniac . Você pode criar um
Map
para colocar o parâmetro paraRequestBody
incluir a imagem.Código para Interface
Classe Code for Java
fonte
Portanto, é uma maneira muito simples de realizar sua tarefa. Você precisa seguir a etapa abaixo: -
1. Primeiro passo
Você precisa fazer a ligação inteira como
@Multipart request
.item
eimage number
é apenas o corpo da corda que está envolvidoRequestBody
. Usamos oMultipartBody.Part class
que nos permite enviar o nome do arquivo real além dos dados do arquivo binário com a solicitação2. Segundo passo
Agora você tem
image path
e você precisa converter emfile
.Agora convertidofile
emRequestBody
utilizando o métodoRequestBody.create(MediaType.parse("multipart/form-data"), file)
. Agora você precisa converter seuRequestBody requestFile
paraMultipartBody.Part
usando o métodoMultipartBody.Part.createFormData("Image", file.getName(), requestBody);
.ImageNumber
eItemId
são meus outros dados que preciso enviar para o servidor, para que eu também faça as duas coisasRequestBody
.Para mais informações
fonte
Carregar arquivos usando o Retrofit é bastante simples Você precisa criar sua interface API como
no código acima, a imagem é o nome da chave; se você estiver usando o php, escreverá $ _FILES ['image'] ['tmp_name'] para obter isso. E filename = "myfile.jpg" é o nome do seu arquivo que está sendo enviado com a solicitação.
Agora, para fazer o upload do arquivo, você precisa de um método que lhe forneça o caminho absoluto do Uri.
Agora você pode usar o código abaixo para fazer upload de seu arquivo.
Para obter explicações mais detalhadas, você pode visitar este Tutorial de atualização de arquivo de upload .
fonte
Versão Kotlin com atualização para privação de
RequestBody.create
:Interface de modernização
e fazer upload
Obrigado a @ jimmy0251
fonte
Não use vários parâmetros no nome da função, basta seguir uma convenção simples de alguns argumentos que aumentará a legibilidade dos códigos , pois você pode fazer o seguinte:
Pode haver várias exceções que você pode encontrar ao usar o Retrofit, todas as exceções documentadas como código , com uma explicação passo a passo
retrofit2/RequestFactory.java
. você pode executar duas funçõesparseParameterAnnotation
eparseMethodAnnotation
onde você pode executar exceções, por favor, faça isso, economizará muito tempo do que pesquisar no google / stackoverflowfonte
no kotlin é bastante fácil, usando métodos de extensões toMediaType , asRequestBody e toRequestBody, aqui está um exemplo:
aqui estou postando alguns campos normais, juntamente com um arquivo pdf e um arquivo de imagem usando multipartes
esta é a declaração da API usando retrofit:
e aqui está como realmente chamá-lo:
fonte