使用Retrofit下载文件和上传文件

使用Retrofit下载文件和上传文件

上传

第一种 只有文件/图片的上传

/**
 * 上传图片
 */
@POST("room/fileUpload")
@Multipart
fun upload(@Part file: MultipartBody.Part): Observable<ResMsg>
private fun upload() {
        val file =    File("/storage/emulated/0/Authentication/ImgAuthenticationFront20171118_140632.jpg")

        val requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file)
        // MultipartBody.Part  和后端约定好Key,这里的partName是用image
        val body = MultipartBody.Part.createFormData("image", file.name, requestFile)

        val observable = RetrofitFactory.instance.create(AppModuleApi::class.java).upload(body)
        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                    LogUtils.print(it)
                })
}
第二种 图片/文件与其他参数都有

第一种PartMap的方式

@POST(ApiConstant.IDEVERIFICATE)
@Multipart
Observable<ResultBean> ideVerificate(@PartMap() Map<String, RequestBody> partMap,
                                             @Part MultipartBody.Part file);
public void upload(String filePath,  String type) {
        File file = new File(filePath);
    
    	//创建文件的RequestBody
        RequestBody requestFile =
                RequestBody.create(MediaType.parse("multipart/form-data"), file);
        // myfile是与后台规定好的字段
        MultipartBody.Part filePart = MultipartBody.Part.createFormData("myfile", file.getName(), requestFile);

        // 创建需要传递的请求参数map
    	HashMap<String, RequestBody> map = new HashMap<>();
    	// 创建请求参数的RequestBody
        RequestBody tokenBody = RequestBody.create(
                MediaType.parse("multipart/form-data"), type);
        // 添加到map中,"type"是与后台规定好的字段
        map.put("type", tokenBody);

        UserModuleApi api = HttpUtils.get().createApi(UserModuleApi.class);
    
        Observable<ResultBean> upload = api.ideVerificate(map, filePart);
	    upload.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<ResultBean>() {
                    @Override
                    public void accept(ResultBean objectResultBean) throws Exception {
                        
                    }
                });
        

    }
第二种body的方式
@POST("/appService/checkRecord")
fun checkRecord(@Body body: RequestBody): Observable<ResMsg>
private fun upload() {
      
       val file = File("/storage/emulated/0/Authentication/ImgAuthenticationFront20171118_140632.jpg")
      
       //构建body  "deviceId","drawVersuon","img",都是与后台规定好的字段
       val requestBody = MultipartBody.Builder().setType(MultipartBody.FORM)
               .addFormDataPart("deviceId", "100")
               .addFormDataPart("drawVersuon", "1")
               .addFormDataPart("img", file.getName(), RequestBody.create(MediaType.parse("image/*"), file))
               .build()
    
       val upload = RetrofitFactory.instance.create(AppModuleApi::class.java).checkRecord(requestBody)
      
       upload.subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe({
                   LogUtils.print(it)
               })
      
   }

下载

/**
  * 文件下载
  */
 @POST("/appService/download")
 @FormUrlEncoded
 @Streaming
 fun download(@Field("gpartNodeName") gpartNodeName: String, @Field("partNodeName") partNodeName: String, @Field("treeNodeName") treeNodeName: String): Observable<ResponseBody>
private fun download() {
        val api = RetrofitFactory.instance.create(AppModuleApi::class.java)
        api.download("马庄乡", "20180503", "174119.xls")
                .excute()
                .doSubscribe(object : BaseObserver<ResponseBody>() {
                    override fun onNext(data: ResponseBody) {
                        super.onNext(data)
                        writeResponseBodyToDisk(data, "马庄乡",
                                "20180503", "174119.xls")
                    }
                })
    }

private fun writeResponseBodyToDisk(body: ResponseBody, gpartNodeName: String,  	partNodeName: String, treeNodeName: String): Boolean {
        val path = Environment.getExternalStorageDirectory().path
        val fileDir = File(path, "ElecPhoto/file/${gpartNodeName}/${partNodeName}")
        if (!fileDir.exists()) {
            val mkdir = fileDir.mkdirs()
            LogUtils.print(mkdir)
        }
        try {

            val file = File(fileDir, treeNodeName)

            var inputStream: InputStream? = null
            var outputStream: OutputStream? = null

            try {
                val fileReader = ByteArray(4096)

                val fileSize = body.contentLength()
                var fileSizeDownloaded: Long = 0

                inputStream = body.byteStream()
                outputStream = FileOutputStream(file)

                while (true) {
                    val read = inputStream!!.read(fileReader)

                    if (read == -1) {
                        break
                    }

                    outputStream.write(fileReader, 0, read)

                    fileSizeDownloaded += read.toLong()

                }

                outputStream.flush()

                return true
            } catch (e: IOException) {
                return false
            } finally {
                if (inputStream != null) {
                    inputStream.close()
                }

                if (outputStream != null) {
                    outputStream.close()
                }
            }
        } catch (e: IOException) {
            return false
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值