说明:
使用Retrofit上传文件,如果选择的上传文件名file.getName()包含中文会出现错误,需要进行编码
.addFormDataPart("file",URLEncoder.encode(file.getName(), "utf-8"), fileBody)
可能出问题的代码:
public static Flowableupload(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 ()); }
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 Flowableupload(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 ()); }
关于:
编者:李国帅
qq:9611153 微信lgs9611153
时间:2021-11-27
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)