android使用retrofit上传文件中包含中文的处理方法

说明:

使用Retrofit上传文件,如果选择的上传文件名file.getName()包含中文会出现错误,需要进行编码
 

.addFormDataPart("file",URLEncoder.encode(file.getName(), "utf-8"), fileBody)

可能出问题的代码:

   public static Flowable<UploadModel> upload(int userId, String session, File file, UpLoadProgressInterceptor.UploadListener uploadListener) {
        RequestBody fileBody = RequestBody.create(MediaType.parse("text/plain; charset=utf-8"), file);
        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addPart(Headers.of("Content-Disposition", "form-data;"), fileBody)
                .addFormDataPart("userId", userId + "")
                .addFormDataPart("file", file.getName(), fileBody)
                .addFormDataPart("session", session)
                .build();

        return RetrofitSingleton.getInstance()
                .getUploadApiService(ApiInterface.class, uploadListener)
                .upload(requestBody)
                .compose(new DefaultTransformer<UploadModel>());
    }
   java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1011, result=-1, data=Intent { dat=content://com.android.fileexplorer.myprovider/external_files/用户管理.doc flg=0x1 }} to activity {com.sunshine.mhs.pension.physician/com.sunshine.mhs.pension.doctormodule.slowdiseasemanage.healthrecords.view.activity.DiagnosisDetailActivity}: java.lang.IllegalArgumentException: Unexpected char 0x7528 at 34 in Content-Disposition value: form-data; name="file"; filename="用户管理.doc"
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4960)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:5001)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2047)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:224)
        at android.app.ActivityThread.main(ActivityThread.java:7590)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
     Caused by: java.lang.IllegalArgumentException: Unexpected char 0x7528 at 34 in Content-Disposition value: form-data; name="file"; filename="用户管理.doc"
        at okhttp3.Headers.checkValue(Headers.java:272)
        at okhttp3.Headers.of(Headers.java:224)
        at okhttp3.MultipartBody$Part.createFormData(MultipartBody.java:259)
        at okhttp3.MultipartBody$Builder.addFormDataPart(MultipartBody.java:324)
        at com.my.view.network.MyNetWork.upload(MyNetWork.java:162)

修改:

 /**
     * 上传文件
     */
    public static Flowable<UploadModel> upload(int userId, String session, File file, UpLoadProgressInterceptor.UploadListener uploadListener) {

        RequestBody fileBody = RequestBody.create(MediaType.parse("text/plain; charset=utf-8"), file);
        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addPart(Headers.of("Content-Disposition", "form-data;"), fileBody)
                .addFormDataPart("userId", userId + "")
                .addFormDataPart("file",URLEncoder.encode(file.getName(), "utf-8"), fileBody)
                .addFormDataPart("session", session) //------------------文件名称需要编码,其他字段不需要
                .build();

        return RetrofitSingleton.getInstance()
                .getUploadApiService(ApiInterface.class, uploadListener)
                .upload(requestBody)
                .compose(new DefaultTransformer<UploadModel>());
    }

关于:

编者:李国帅

qq:9611153 微信lgs9611153

时间:2021-11-27  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值