English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Antes, o upload de imagens era feito diretamente, convertendo a imagem em um fluxo de entrada e fornecendo ao servidor, sem usar uma framework para transmitir a imagem.
Recentemente, ao fazer um projeto, pensei em mudar o método de upload de imagens.
Até onde o Android desenvolveu, Okhttp está se tornando cada vez mais importante, então, desta vez, eu escolhi usar Okhttp para upload de imagens.
Okhttp já foi atualizado para Okhttp3Versão, a utilização é um pouco diferente em comparação com a anterior. Encontrei muitos materiais na internet,
E com a ajuda dos colegas de backend java, finalmente conseguimos upload de várias imagens, além de passar alguns pares de chave-valor.
Aqui está a encapsulação do processo:
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); /** * Upload de várias imagens e parâmetros * @param reqUrl Endereço da URL * @param params Parâmetros * @param pic_key Palavra-chave para upload de imagem * @param paths Caminho da imagem */ public Observable<String> sendMultipart(String reqUrl,Map<String, String> params,String pic_key, List<File> files){ return Observable.create(new Observable.OnSubscribe<String>(){ @Override public void call(Subscriber<? super String> subscriber) { MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder(); multipartBodyBuilder.setType(MultipartBody.FORM); //Percorrer todos os parâmetros do map para o builder if (params != null){ for (String key : params.keySet()) { multipartBodyBuilder.addFormDataPart(key, params.get(key)); } } //Percorrer todos os caminhos absolutos de imagens em paths para o builder, e acordar chave como "upload" como chave aceita pelo servidor para múltiplas imagens if (files != null){ for (File file : files) { multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file)); } } //Construir corpo da solicitação RequestBody requestBody = multipartBodyBuilder.build(); Request.Builder RequestBuilder = new Request.Builder(); RequestBuilder.url(reqUrl);// Adicionar endereço da URL RequestBuilder.post(requestBody); Request request = RequestBuilder.build(); mOkHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { subscriber.onError(e); subscriber.onCompleted(); call.cancel(); } @Override public void onResponse(Call call, Response response) throws IOException { String str = response.body().string(); subscriber.onNext(str); subscriber.onCompleted(); call.cancel(); } }); } }); }
Na chamada na interface de UI:
OkHttp3Utils.getInstance().sendMultipart(Constants.URL.URL_ADD_NOTICE, mMap, "appendix", mImageList) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.newThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable throwable) { LogUtil.i(TAG, "throwable:") + throwable.toString()); } @Override public void onNext(String s) { LogUtil.i(TAG, "s:") + s); } });
Durante o processo de depuração, uma vez que escrevi multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file)); como multipartBodyBuilder.addFormDataPart(pic_key, null, RequestBody.create(MEDIA_TYPE_PNG, file));, o servidor não pôde obter a imagem de maneira convencional (apesar de poder ver os dados da imagem durante a depuração de breakpoints), isso deve ser notado.
Isso é tudo o que há no artigo. Espero que ajude na sua aprendizagem e que você apoie fortemente o tutorial de clamor.
Declaração: o conteúdo deste artigo é extraído da Internet, pertence ao respectivo detentor dos direitos autorais, fornecido voluntariamente pelos usuários da Internet e carregado por eles mesmos. Este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade por questões legais relacionadas. Se você encontrar conteúdo suspeito de violação de direitos autorais, seja bem-vindo a enviar e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Caso seja confirmado, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)