Uploading Pdf to server using Retrofit 2
11,145
In your PdfUploadFunction()
when attaching the file to the RequestBody pdf
your calling the path to the file instead of the actual file.
Edit to
RequestBody Pdf=RequestBody.create(MediaType.parse("application/pdf"), new File(PdfPathHolder))
And No Thank You for the FilePath
class.
Needed that in for my code to work.
Also consider adding a call timeout in Retrofit getApiClient()
because depending of file size the call might produce a TimeOut
failure.
Edit to
public static Retrofit getApiClient(){
if(retrofit==null){
retrofit=new Retrofit.Builder()
.baseUrl(BaseUrl)
.addConverterFactory(GsonConverterFactory.create())
.client(new OkHttpClient().newBuilder()
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build())
.build();
}
return retrofit;
}
Author by
Sumit Roy
Updated on June 26, 2022Comments
-
Sumit Roy almost 2 years
I am trying to upload Pdf files to server using Retrofit 2.0 and store their path to my MySQL database. I am successful in storing the path but the pdf that is supposed to be stored in my home directory is corrupted.
upload.php
<?php require "init.php"; if($con) { $title=$_POST['title']; $pdf=$_POST['pdf']; //Getting the server ip $server_ip = gethostbyname(gethostname()); $upload_path="uploads/$title.pdf"; $upload_url = 'http://'.$server_ip.'/pdfupload1/'.$upload_path; $sql="insert into pdfinfo1(title,path) values('$title','$upload_url');"; if(mysqli_query($con,$sql)) { file_put_contents($upload_path,$pdf); echo json_encode(array('response'=>"Pdf Uploaded Successfully")); } else { echo json_encode(array('response'=>"Pdf Upload Failed")); } mysqli_close($con); } ?>
ApiClient.java
public class ApiClient { private static final String BaseUrl="http://10.0.2.2/pdfupload1/"; private static Retrofit retrofit; public static Retrofit getApiClient() { if(retrofit==null) { retrofit=new Retrofit.Builder().baseUrl(BaseUrl).addConverterFactory(GsonConverterFactory.create()).build(); } return retrofit; } }
ApiInterface.java
public interface ApiInterface { @Multipart @POST("upload.php") Call<PdfClass> PdfUploadFunction (@Part("title") RequestBody title, @Part("pdf") RequestBody image); }
PdfClass.java
public class PdfClass { //This is a Model Class Retrofit @SerializedName("title") private String Title; @SerializedName("pdf") private String Pdf; @SerializedName("response") private String Response; public String getResponse() { return Response; } }
FilePath.java
public class FilePath { /** * Method for return file path of Gallery image * * @param context * @param uri * @return path of the selected image file from gallery */ public static String getPath(final Context context, final Uri uri) { //check here to KITKAT or new version final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } } //DownloadsProvider else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } // MediaProvider else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[] { split[1] }; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(uri.getScheme())) { // Return the remote address if (isGooglePhotosUri(uri)) return uri.getLastPathSegment(); return getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } /** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * * @param context The context. * @param uri The Uri to query. * @param selection (Optional) Filter used in the query. * @param selectionArgs (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = { column }; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int index = cursor.getColumnIndexOrThrow(column); return cursor.getString(index); } } finally { if (cursor != null) cursor.close(); } return null; } /** * @param uri The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ public static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ public static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ public static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is Google Photos. */ public static boolean isGooglePhotosUri(Uri uri) { return "com.google.android.apps.photos.content".equals(uri.getAuthority()); } }
FirstActivity.java
public class FirstActivity extends AppCompatActivity { Button button1,button2; EditText imagename; ImageView imageView; private static final int PDF_REQUEST=777; private Bitmap bitmap; public int PDF_REQ_CODE = 1; String PdfNameHolder, PdfPathHolder, PdfID; Uri uri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); button1=(Button)findViewById(R.id.button); button2=(Button)findViewById(R.id.button2); imagename=(EditText)findViewById(R.id.editText1); //imageView=(ImageViewfindViewById(R.id.imageView1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //selectImage(); selectPdf(); } }); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // uploadImage(); PdfUploadFunction(); } }); } private void selectPdf() { Intent intent = new Intent(); intent.setType("application/pdf"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Pdf"), PDF_REQ_CODE); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PDF_REQ_CODE && resultCode == RESULT_OK && data != null && data.getData() != null) { uri = data.getData(); } } public void PdfUploadFunction() { PdfNameHolder = imagename.getText().toString(); PdfPathHolder = FilePath.getPath(this, uri); //File file=new File(uri.getPath()); RequestBody Title=RequestBody.create(MediaType.parse("text/plain"),imagename.getText().toString()); RequestBody Pdf=RequestBody.create(MediaType.parse("application/pdf"), PdfPathHolder); ApiInterface apiInterface=ApiClient.getApiClient().create(ApiInterface.class); Call<PdfClass> call=apiInterface.PdfUploadFunction(Title,Pdf); call.enqueue(new Callback<PdfClass>() { @Override public void onResponse(Call<PdfClass> call, Response<PdfClass> response) { PdfClass pdfClass=response.body(); Toast.makeText(getApplicationContext(),"Server Response: "+pdfClass.getResponse(),Toast.LENGTH_LONG).show(); } @Override public void onFailure(Call<PdfClass> call, Throwable t) { } }); } public void AllowRunTimePermission(){ if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) { Toast.makeText(this,"READ_EXTERNAL_STORAGE permission Access Dialog", Toast.LENGTH_LONG).show(); } else { ActivityCompat.requestPermissions(this,new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE}, 1); } } @Override public void onRequestPermissionsResult(int RC, String per[], int[] Result) { switch (RC) { case 1: if (Result.length > 0 && Result[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this,"Permission Granted", Toast.LENGTH_LONG).show(); } else { Toast.makeText(this,"Permission Canceled", Toast.LENGTH_LONG).show(); } break; } } }
Thanks in advance for any help..