android附件上传下载(图片,语音,视频)

本文详细介绍了Android中如何实现附件的上传和下载,包括图片选择、语音录制与播放、视频拍摄与播放。在上传过程中,要注意避免因数据未完全写入而引发的ProtocolException错误,而在下载部分,提到了从相册选择图片、使用Glide预览,以及语音和视频的处理方式。对于大文件如视频,建议在客户端进行适当压缩,以防止服务器如nginx的大小限制导致的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上传

所有的上传都是一样的都是转成流的形式发送给服务器,注意写入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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值