Retrofit 2.0 슈퍼 실천 (3), 파일 / 다 중 이미지 업로드 / JSon 문자열 쉽게 구현
앞의 두 자 세 를 통 해 입문 하 다.
Retrofit 2.0 의 앞 두 편의 기초 입문 과 사례 실천 을 통 해 Retrofit 를 사용 하여 네트워크 에 접근 하 는 방법 을 파악 하고 사용자 정의 header 를 추가 하 는 것 은 SSL 인증서, 기본 디 버 깅 기반, coolkie 동기 화 를 포함 하지만 파일 업로드 가 필요 한 경우 가 많 습 니 다. 오늘 주 제 는 Retrofit 2.0 으로 파일 과 그림 을 업로드 하 는 방법 을 공유 합 니 다.
Retrofit1. x 로 파일 업로드
2.0 이전 버 전에 사진 올 리 는 자세 다 들 아 시 잖 아 요.
public interface ApiManager {
@Multipart
@POST("/user/addCarInfo")
void addCarInfo(@QueryMap Map options, @Part("file") TypedFile file, Callback response);
}
Retrofit 2. X 로 업로드
Retrofit 2 파일 업로드
2, 0 을 사용 하면 Typed File 형식 이 민영화 되 었 고 1.9 의 전송 방식 을 계속 사용 할 수 없습니다. 더 이상 상부 에서 호출 할 수 없습니다. MultipartBody. Part 로 대체 할 수 있 습 니 다.
public interface FileUploadService {
@Multipart
@POST("upload")
Call upload(@Part("description") RequestBody description,
@Part MultipartBody.Part file);
}
구체 적 인 용법.
// RequestBody, RequestBody
RequestBody requestFile =
RequestBody.create(MediaType.parse("multipart/form-data"), file);
// MultipartBody.Part is used to send also the actual file name
MultipartBody.Part body =
MultipartBody.Part.createFormData("image", file.getName(), requestFile);
//
String descriptionString = "hello, ";
RequestBody description =
RequestBody.create(
MediaType.parse("multipart/form-data"), descriptionString);
//
Call call = service.upload(description, body);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call,
Response response) {
Log.v("Upload", "success");
}
@Override
public void onFailure(Call call, Throwable t) {
Log.e("Upload error:", t.getMessage());
}
});
}
사진 한 장 을 상부 에 보고 하 다.
@Multipart
@POST("you methd url upload/")
Call uploadFile(
@Part("avatar\\\\"; filename=\\\\"avatar.jpg") RequestBody file);
여러 장의 사진 을 상부 에 보고 하 다.
@POST("upload/")
Call uploadFiles(@Part("filename") String description,
@Part("pic\\\\"; filename=\\\\"image1.png") RequestBody imgs1,
@Part("pic\\\\"; filename=\\\\"image2.png") RequestBody imgs2,
@Part("pic\\\\"; filename=\\\\"image3.png") RequestBody imgs3,
@Part("pic\\\\"; filename=\\\\"image4.png") RequestBody imgs4);
하면, 만약, 만약...
@Multipart
@POST("{url}")
Observable uploadFiles(
@Path("url") String url,
@Part("filename") String description,
@PartMap() Map maps);
또는:
@Multipart
@POST("{url}")
Observable uploads(
@Path("url") String url,
@Part("description") RequestBody description,
@Part("filekey") MultipartBody.Part file);
그림 과 매개 변 수 를 동시에 보고 하 다.
@Multipart
@POST("upload/")
Call register(
@QueryMap Map usermaps,
@Part("avatar\\\\"; filename=\\\\"avatar.jpg") RequestBody avatar,
);
이런 방식 은 당신 으로 하여 금 사용자 등록 문 제 를 잘 해결 하 게 합 니 다.사용자 의 모든 정보 포함
위의 코드 세 션 에 표 시 된 코드 초기 화 (RequestBody 와 description), 파일 업로드 서 비 스 를 어떻게 사용 하 는 지.이미 언급 한 바 와 같이 OkHttp RequestBody 클래스 에서 설명 합 니 다.RequestBody. create () 방법 2 개가 필요 합 니 다.
설명 을 제외 하고 추가 파일 을 Multipart Body 의 인 스 턴 스 로 포장 해 야 합 니 다.이것 이 바로 당신 이 클 라 이언 트 에서 파일 을 올 리 는 데 적당 한 것 을 사용 해 야 한 다 는 것 입 니 다.또한, createformData 의 uploadFile (Uri fileUri) 방법 과 재 활용 을 추가 할 수 있 습 니 다.
Content - Type 설정
설정 한 내용 유형 에 주의 하 십시오.바 텀 OkHttp 클 라 이언 트 를 차단 하고 콘 텐 츠 유형 애플 리 케 이 션 / json 을 변경 하면 서버 가 역 직렬 화 과정 에서 문제 가 발생 할 수 있 습 니 다.사용자 정의 multipart / form - data 가 없 는 지 확인 하 십시오.
upLoad 그림 도 Content - Type 을 "image / jpg" 형식 으로 구체 적 으로 가리 킬 수 있 습 니 다.
RequestBody requestFile =
RequestBody.create(MediaType.parse("image/jpg"), mFile);
그리고 자주 사용 하 는 것:
JSON 올 리 기
@POST("/uploadJson")
Observable uploadjson(
@Body RequestBody jsonBody);
upLoadJSon 도 Content - Type 을 "application / json" 형식 으로 구체 적 으로 가리 킬 수 있 습 니 다.
구체 적 으로 저희 RequestBody 를 조립 하면 이렇게 할 수 있 습 니 다.
RequestBody body=
RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), jsonString);
이어서 이렇게 호출 할 수 있 습 니 다.
//
Call call = service.uploadJson(description, body);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call,
Response response) {
Log.v("Upload", "success");
}
@Override
public void onFailure(Call call, Throwable t) {
Log.e("Upload error:", t.getMessage());
}
});
}
서버 가 어떤 유형의 model 로 돌아 가 는 지 에 대해 개발 자 는 사용자 정의 할 수 있 습 니 다. 예 를 들 어 APi 의 Response Body 를 자신의
javaBean
로 지정 할 수 있 습 니 다. 물론 상부 구축 Callback
할 때 도 Call
이 어야 합 니 다.@POST("/uploadJson")
Observable uploadjson(
@Body RequestBody jsonBody);
서버 예제 에 파일 업로드
백 엔 드 항목 이 있다 면 아래 예제 코드 에 의존 할 수 있 습 니 다.간단 한 api 업로드 서버 를 사용 합 니 다.이 밖 에 api 에 인자 전송 요청 을 알려 드 립 니 다. Node. js 를 사용 하기 때 문 입 니 다.
해 석 된 반전 함수 입 니 다. 우 리 는 모든 필드 를 기록 하여 출력 을 표시 합 니 다.
method: 'POST',
path: '/upload',
config: {
payload: {
maxBytes: 209715200,
output: 'stream',
parse: false
},
handler: function(request, reply) {
var multiparty = require('multiparty');
var form = new multiparty.Form();
form.parse(request.payload, function(err, fields, files) {
console.log(err);
console.log(fields);
console.log(files);
return reply(util.inspect({fields: fields, files: files}));
});
}}
안 드 로 이 드 클 라 이언 트 는 반환 형식의 문자열 을 받 았 습 니 다. 업로드 에 성공 한 상태의 리 셋 을 받 을 것 입 니 다.물론 니 가 처리 해도 되 고 안 해도 돼.성공 적 으로 요청 한 출력 단 과 유효 부하 에 대한 분석 을 볼 수 있 습 니 다.첫 번 째 빈 대상.이후 요청 의 일부분 으로 만 필드 를 볼 수 있 습 니 다.이 어 파일 설명, 파일 크기, 파일 닉네임, 저장 경 로 를 받 을 수 있 습 니 다.
서버 에서 유효한 데 이 터 를 분석 하 는 로그
Null
{ description: [ 'hello, this is description speaking' ] }
{ picture:
[ { fieldName: 'picture',
originalFilename: '20160312_095248.jpg',
path: '/var/folders/rq/q_m4_21j3lqf1lw48fqttx_80000gn/T/X_sxX6LDUMBcuUcUGDMBKc2T.jpg',
headers: [Object],
size: 39369 } ] }
돌이켜보다
파일 업 로드 는 최신 프로그램 에서 없어 서 는 안 될 기능 입 니 다. 이 기능 을 응용 프로그램 에 통합 하여 리 모델 링 을 사용 할 수 있 습 니 다.본 고 는 안 드 로 이 드 장치 에서 백 엔 드 서버 에 파일 을 보고 하 는 첫 번 째 절 차 를 안내 합 니 다.
원본 코드:https://github.com/Tamicer/Novate
Retrofit 2.0 시리즈
Retrofit 2.0 시리즈 읽 어 주세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Picasso 상세 설명, 완벽 호 환 OkHttp 3.3, 캐 시 최적화, https 지원왜 Fresco, Glide 가 이렇게 강 한 배경 에서 나 는 그때 의 Picasso 가 생각 났 고 왜 이 글 을 썼 을 까?최근 프로젝트 는 square 회사 의 RxAndroid, Retrfit 과 OKhtt...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.