• Retrofit Upload multiple files and parameters


    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的封装。后面再说吧~
  • 相关阅读:
    让mysql查询强制走索引
    【转】起始时间和终止时间,循环输出每天
    【转】31个实用的find命令
    Hive数据倾斜解决办法总结
    网站架构之可扩展性
    网站架构之高可用性
    网站架构之可伸缩性
    kafka中的消费组
    MySQL知识点小结
    [数据挖掘]用户画像
  • 原文地址:https://www.cnblogs.com/yizuochengchi2012/p/6413004.html
Copyright © 2020-2023  润新知