Retrofit2.0 파일 업로드 및 다운로드

11638 단어 uploadretrofit

파일 업로드


Retrofit 2.0은 OkHttp의 Request Body 또는 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 클래스, 실제 파일 파일을 보낼 수 있도록 하는 것은 서버에 업로드할 파일입니다..

  • 아래의 이 섹션은 파일의 URI를 uploadFile(Uri fileUri) 방법의 매개 변수로 표시합니다.파일을 선택하면 Android의 라이프 사이클에 대한 onActivityResult () 방법으로 돌아옵니다.이 방법에서 이 파일의 URI를 얻을 수 있습니다. 업로드 파일 () 을 통해 파일을 업로드할 수 있습니다.
    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());
            }
        });
    }

    파일 다운로드


    요청 요청 정의

    // option 1: a resource relative to your base URL
    @GET("/resource/example.zip")
    Call<ResponseBody> downloadFileWithFixedUrl();
    
    // option 2: using a dynamic URL
    @GET
    Call<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
    @GET
    Call<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

    좋은 웹페이지 즐겨찾기