728x90

Retrofit2 라이브러리를 이용하여 파일을 업로드하는 예제 예시다.

파일 업로드 외에 POST 변수 idx를 추가해서 보낼 때,

RequestBody descBody = RequestBody.create(MediaType.parse("text/plain"), idx);

가 추가하면 된다.


Retrofit2 통신에 대한 기본 이해는 https://link2me.tistory.com/1806 에 이미지 도식도를 참조하시라.



앱 build.gradle

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
    implementation 'com.google.android.material:material:1.2.1'

    implementation 'com.squareup.okhttp3:okhttp:4.4.0'
    implementation 'com.squareup.retrofit2:retrofit:2.7.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.7.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:4.4.0'
} 


<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


public interface DataCommAPI {

    @Multipart
    @POST(RetrofitURL.URL_ImageUpload)
    Call<UploadResult> uploadFile(@Part("idx") RequestBody idx,
                                  @Part MultipartBody.Part uploaded_file);
}

public class UploadResult {
    private String result;

    public String getResult() {
        return result;
    }

}

public class RetrofitURL {
    public static final String IPADDRESS = "http://www.abc.com/androidSample/upload/";

    public static final String URL_ImageUpload = "upload.php";
}

public class APIRequest {
    static Retrofit retrofit = null;

    public static Retrofit getClient() {
        if (retrofit==null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(RetrofitURL.IPADDRESS)
                    .client(createOkHttpClient())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }

    public static OkHttpClient createOkHttpClient() {
        // 네트워크 통신 로그(서버로 보내는 파라미터 및 받는 파라미터) 보기
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        builder.addInterceptor(interceptor);
        return builder.build();
    }
}

private void uploadImage(String sourceImageFile, String idx){
     DataCommAPI retrofitInterface = APIRequest.getClient().create(DataCommAPI.class);

     File file = new File(sourceImageFile);
     RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
     MultipartBody.Part body = MultipartBody.Part.createFormData("uploaded_file", file.getName(), requestFile);
     RequestBody descBody = RequestBody.create(MediaType.parse("text/plain"), idx);

     Call<UploadResult> call = retrofitInterface.uploadFile(descBody,body);
     call.enqueue(new Callback<UploadResult>() {
         @Override
         public void onResponse(Call<UploadResult> call, Response<UploadResult> response) {
             if (response.isSuccessful()) {
                 UploadResult responseBody = response.body();
                 if(responseBody.getResult().contains("success")){
                     Toast.makeText(getApplicationContext(), "파일 업로드 성공", Toast.LENGTH_LONG).show();
                 } else {
                     Utils.showAlert(mContext,"파일 업로드","파일 업로드 실패");
                 }

             } else {
                 ResponseBody errorBody = response.errorBody();
                 Gson gson = new Gson();
                 try {
                     Response errorResponse = gson.fromJson(errorBody.string(), Response.class);
                    
Toast.makeText(getApplicationContext(), errorResponse.message(),

                        Toast.LENGTH_LONG).show();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
         }

         @Override
         public void onFailure(Call<UploadResult> call, Throwable t) {
             Log.e(TAG, "onFailure: "+t.getLocalizedMessage());
         }
     });

 }




블로그 이미지

Link2Me

,