使用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
}
}