Retrofit2.0 上传文件和下载文件

来源:互联网 发布:网络硬件设备 编辑:程序博客网 时间:2024/06/08 13:44

上传文件

Retrofit2.0 需要OkHttp的 RequestBody 或MultipartBody.Part这两个类来实现服务器上传文件。

下面我们看一个简单的定义好的上传文件的接口:

public interface FileUploadService {      @Multipart    @POST("upload")    Call<ResponseBody> upload(@Part("description") RequestBody description,                              @Part MultipartBody.Part file);}

解释下上面的代码:

  • @Part(“description”) 就是RequestBody实例中包裹的字符串值 ;
  • @Part MultipartBody.Part file 我们使用MultipartBody.Part类,使我们能够发送实际文件 file就是你要往服务器上传的文件。

下面的这段显示文件的URI作为uploadFile(Uri fileUri)方法的参数。如果你选择一个文件,你会在Android的生命周期的onActivityResult()方法内返回。在这个方法中,你可以得到该文件的URI,你就可以通过uploadFile()这个方法来上传文件。

private void uploadFile(Uri fileUri) {      // create upload service client    FileUploadService service =            ServiceGenerator.createService(FileUploadService.class);    // https://github.com/iPaulPro/aFileChooser/blob/master/aFileChooser/src/com/ipaulpro/afilechooser/utils/FileUtils.java    // use the FileUtils to get the actual file by uri    File file = FileUtils.getFile(this, fileUri);    // create RequestBody instance from file    RequestBody requestFile =            RequestBody.create(MediaType.parse("multipart/form-data"), file);    // MultipartBody.Part is used to send also the actual file name    MultipartBody.Part body =            MultipartBody.Part.createFormData("picture", file.getName(), requestFile);    // add another part within the multipart request    String descriptionString = "hello, this is description speaking";    RequestBody description =            RequestBody.create(                    MediaType.parse("multipart/form-data"), descriptionString);    // finally, execute the request    Call<ResponseBody> call = service.upload(description, body);    call.enqueue(new Callback<ResponseBody>() {        @Override        public void onResponse(Call<ResponseBody> call,                               Response<ResponseBody> response) {            Log.v("Upload", "success");        }        @Override        public void onFailure(Call<ResponseBody> call, Throwable t) {            Log.e("Upload error:", t.getMessage());        }    });}

下载文件

定义请求Request

// option 1: a resource relative to your base URL@GET("/resource/example.zip")Call<ResponseBody> downloadFileWithFixedUrl();// option 2: using a dynamic URL@GETCall<ResponseBody> downloadFileWithDynamicUrlSync(@Url String fileUrl);  

请求

FileDownloadService downloadService = ServiceGenerator.create(FileDownloadService.class);Call<ResponseBody> call = downloadService.downloadFileWithDynamicUrlSync(fileUrl);call.enqueue(new Callback<ResponseBody>() {      @Override    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {        if (response.isSuccess()) {            Log.d(TAG, "server contacted and has file");            boolean writtenToDisk = writeResponseBodyToDisk(response.body());        } else {            Log.d(TAG, "server contact failed");        }    }    @Override    public void onFailure(Call<ResponseBody> call, Throwable t) {        Log.e(TAG, "error");    }});

保存文件

private boolean writeResponseBodyToDisk(ResponseBody body) {      try {        // todo change the file location/name according to your needs        File futureStudioIconFile = new File(getExternalFilesDir(null) + File.separator + "Future Studio Icon.png");        InputStream inputStream = null;        OutputStream outputStream = null;        try {            byte[] fileReader = new byte[4096];            long fileSize = body.contentLength();            long fileSizeDownloaded = 0;            inputStream = body.byteStream();            outputStream = new FileOutputStream(futureStudioIconFile);            while (true) {                int read = inputStream.read(fileReader);                if (read == -1) {                    break;                }                outputStream.write(fileReader, 0, read);                fileSizeDownloaded += read;                Log.d(TAG, "file download: " + fileSizeDownloaded + " of " + fileSize);            }            outputStream.flush();            return true;        } catch (IOException e) {            return false;        } finally {            if (inputStream != null) {                inputStream.close();            }            if (outputStream != null) {                outputStream.close();            }        }    } catch (IOException e) {        return false;    }}

如果你下载的文件很大,则使用@Streaming 定义Request

@Streaming@GETCall<ResponseBody> downloadFileWithDynamicUrlAsync(@Url String fileUrl);  

使用异步方式:

final FileDownloadService downloadService =                  ServiceGenerator.create(FileDownloadService.class);new AsyncTask<Void, Long, Void>() {     @Override   protected Void doInBackground(Void... voids) {       Call<ResponseBody> call = downloadService.downloadFileWithDynamicUrlSync(fileUrl);       call.enqueue(new Callback<ResponseBody>() {           @Override           public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {               if (response.isSuccess()) {                   Log.d(TAG, "server contacted and has file");                   boolean writtenToDisk = writeResponseBodyToDisk(response.body());                   Log.d(TAG, "file download was a success? " + writtenToDisk);               }               else {                   Log.d(TAG, "server contact failed");               }           }       return null;   }}.execute();         

转载:http://blog.csdn.net/greathfs/article/details/51892499

1 5
原创粉丝点击