Retrofit 的介绍以及基本使用 这里不再说明。

关于多文件上传 以及上传文件的同时携带多个参数说明

网上涉及到的不是太多。

上一张帅图:

代码:

 apiService:

  

/**
  
params 参数 files 文件
*/
@Multipart
@POST
Observable<String> uploadFile(@Url String url, @Part List<MultipartBody.Part > files,@PartMap Map<String, RequestBody> params);
ApiInteractor:
Subscription uploadFile(String url, List<MultipartBody.Part > files, Map<String, RequestBody> param, BaseSubscribe<String> subsribe);

ApiInteractorImpl:
/**
* 文件上传
* @param url
* @param param
* @param subsribe
* @return
*/
@Override
public Subscription uploadFile(String url, List<MultipartBody.Part > files, Map<String, RequestBody> param, BaseSubscribe<String> subsribe) {
Observable<String> uploadFile = apiService.uploadFile(url,files,param);
Subscription subscription = uploadFile.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retryWhen(new RetryWithDelay(App.getContext(), startTimeOut, maxTimeOut, SECONDS))
.onErrorReturn(throwable -> null)
.subscribe(subsribe);
return subscription;
} Activity 中代码:
rivate void upload() {
File file2 = new File(cacheVideo + "girl.jpg");
Map<String,RequestBody> map = new HashMap<>();//参数
List<MultipartBody.Part> mList = new ArrayList<>();//文件 map.put("后台需要的字段key",createPartFromString("你的参数值"));
   mList.add(prepareFilePart("resource",file2));
    Subscription uploadFile = api.uploadFile(ConstantApi.uploadMp4AAC,mList,map, new BaseSubscribe<String>() {
@Override
public void onSuccess(String result) {
Log.d("上传返回结果是", "onSuccess: "+result);
}
});
subscription.add(uploadFile);
}
public static final String MULTIPART_FORM_DATA = "multipart/form-data";

private RequestBody createPartFromString(String descriptionString) {
return RequestBody.create(
MediaType.parse(MULTIPART_FORM_DATA), descriptionString);
} private MultipartBody.Part prepareFilePart(String partName, File fileName) {
RequestBody requestFile = RequestBody.create(MediaType.parse(MULTIPART_FORM_DATA),fileName);
UploadRequestBody uploadRequestBody=new UploadRequestBody(requestFile, new UploadRequestBody.Listener() {
@Override
public void onRequestProgress(long bytesWritten, long contentLength) {
Log.e("上传进度","file1:"+contentLength+":"+bytesWritten);
}
});
return MultipartBody.Part.createFormData(partName, fileName.getName(), uploadRequestBody);
} 重写RequestBody 监听回调
/**
* 文件上传
* Created by swplzj on 17/2/17.
*/ public class UploadRequestBody extends RequestBody { protected RequestBody delegate;
protected Listener listener; protected CountingSink countingSink; public UploadRequestBody(RequestBody delegate, Listener listener) {
this.delegate = delegate;
this.listener = listener;
} @Override
public MediaType contentType() {
return delegate.contentType();
} @Override
public long contentLength() {
try {
return delegate.contentLength();
} catch (IOException e) {
e.printStackTrace();
}
return -1;
} @Override
public void writeTo(BufferedSink sink) throws IOException { countingSink = new CountingSink(sink);
BufferedSink bufferedSink = Okio.buffer(countingSink); delegate.writeTo(bufferedSink); bufferedSink.flush();
} protected final class CountingSink extends ForwardingSink { private long bytesWritten = 0; public CountingSink(Sink delegate) {
super(delegate);
} @Override
public void write(Buffer source, long byteCount) throws IOException {
super.write(source, byteCount); bytesWritten += byteCount;
listener.onRequestProgress(bytesWritten, contentLength());
} } public interface Listener {
void onRequestProgress(long bytesWritten, long contentLength);
}
}

// ==================至此 基本结束 Retrofit 同时上传多个参数 和 文件结束

主要是 @后面的关键字段我们可能不是太清楚 或者很少用到

参考: 

  https://square.github.io/retrofit/

  https://futurestud.io/tutorials/retrofit-2-how-to-upload-files-to-server欢迎交流指正学习~

 

群 521039620 群主很热心 很谦逊 有问题 找晨希哥~ 

最后: 最近看到应用商店有配音的软件 X配音 配音功能做的还不错 反编译源码 看到 他是将 用FFmpeg 从pcm入手 和video合成。关于 Pcm 合成 以及指定位置插入 目前还不清楚。 后面我自己尝试了一下 用切割的方法。大致实现了 配音 跟读 混合 合成


但是感觉切割 还是不太好。 可能表达的不太清楚。后面解决问题之后 会记录一下 FFmpeg的使用。主要使用到 //音频合成 compile 'com.googlecode.mp4parser:isoparser:1.1.21'
//音频资源转换格式
compile 'com.github.adrielcafe:AndroidAudioConverter:0.0.8' 其中AndroidAudioConverter底层是基于 FFmpeg的封装。后面再说吧~

最新文章

  1. 移动电商时代、微分销商城O2O生活圈系统开发功能分析
  2. 商贸食品车销成功应用PDA抄单 现场开单 打印销售单安卓智能手持POS应用
  3. web开发常用的js验证,利用正则表达式验证邮箱、手机、身份证等输入
  4. Delphi的移动文件方法(转)/删除文件:/文件的复制
  5. 12_RHEL7.1普通用户添加sudo权限
  6. 【2017年新篇章】 .NET 面试题汇总(二)
  7. intelliJ IDEA安装、激活与汉化
  8. 基于Nginx和Zookeeper实现Dubbo的分布式服务
  9. 项目ITP(二) 二维码 拿起你的手机装一装,扫一扫 【每日一搏】
  10. image的srcset属性
  11. python5-常用模块
  12. nginx 配置中的if判断
  13. UVA12546_LCM Pair Sum
  14. Jquery 大纲
  15. shell学习笔记之控制结构(三)
  16. Py3+PyQt5+Eric6:学习记录之第一天:点击按钮获取文本框的值并输出。
  17. lintcode-161-旋转图像
  18. vs2005 QT4.7.1编译 详细
  19. Selenium2学习(十三)-- JS处理滚动条
  20. JMeter 分布式测试部署

热门文章

  1. 【独立开发人员er Cocos2d-x实战 007】使用Cocos2dx UserDefault.xml
  2. js appendChild 自带remove和append两个功能
  3. spring boot---WebFilter注解 实现自定义登录过滤器
  4. chdir函数的使用【学习笔记】
  5. idea类名下有红色波浪线
  6. String、StringBuffer和StringBuilder有什么区别?
  7. java利用Aspose.words.jar将本地word文档转化成pdf(完美破解版 无水印 无中文乱码)
  8. Android 布局之GridLayout(转载)
  9. android 在一个应用中启动另一个应用
  10. 高级开发不得不懂的Redis Cluster数据分片机制