上传
所有的上传都是一样的都是转成流的形式发送给服务器,注意写入body是一个异步操作,我写的网络发送(okhttp+rxjava)也是异步的,所以在部分机型上会报错,java.net.ProtocolException: expected 6137 bytes but received 7081 ,这是因为还没有把所有数据写入body就发送了,所有可以在写入完成之后再发送。
final File file = new File(path);//path为文件路径
Observable.just(file).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.map(new Function<File, RequestBody>() {
@Override
public RequestBody apply(File file) throws Exception {
RequestBody requestFile =
RequestBody.create(MediaType.parse("multipart/form-data"), file);
return requestFile;
}
}).subscribe(new Observer<RequestBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(RequestBody requestBody) {
final MultipartBody.Part part =
MultipartBody.Part.createFormData("uploadFile", file.getName(), requestBody);
upload(part);//上传方法
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
//上传方法
private void upload(MultipartBody.Part part) {
Observable<HttpResult<FileUploadRec>> call = NetConnect.getService(HomeApi.class).uploadFile(part);
call.compose(NetConnect.<HttpResult<FileUploadRec>>changeThread()).subscribe(new CallBackObserver<HttpResult<FileUploadRec>>(false) {
@Override
public void onSuccess(HttpResult<FileUploadRec> response) {
}
@Override
public void onFailure(HttpResult<FileUploadRec> response){
}
});
}
/**文件上传*/
@Multipart
@POST("/protal-web/app/ftpUpload/ftpUpload.htm")
Observable<HttpResult<FileUploadRec>> uploadFile(@Part MultipartBody.Part uploadFile);
下载
/**下载文件*/
@Streaming
@GET
Call<ResponseBody> downloadFile(@Url String filePath);
Call<ResponseBody> call = NetConnect.getService(HomeApi.class).downloadFile(path);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
}
@Override
public void onFailure(Call<Respo