Я пытаюсь загрузить несколько файлов на свой сервер с помощью сетевой библиотеки Fast Android. Я использую библиотеку Декстер, чтобы выбрать файл. Вот мой код:
public class RegisterActivity extends AppCompatActivity {
private ImageButton ibPick;
private CircleImageView civProfile;
private Button btnConfirm, btnSubmit, btnNidFront, btnNidBack;
private EditText editTextEmail, editTextPassword, editTextName, editTextMobile, editTextOccupation, editTextAddress, editTextNidBack;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
ibPick = findViewById(R.id.btn_pick);
civProfile = findViewById(R.id.profile_image);
btnConfirm = findViewById(R.id.btn_confirm);
btnSubmit = findViewById(R.id.btn_submit);
btnNidFront = findViewById(R.id.btnNidFront);
btnNidBack = findViewById(R.id.btnNidBack);
editTextName = findViewById(R.id.editTextName);
editTextPassword = findViewById(R.id.editTextPass);
editTextEmail = findViewById(R.id.editTextEmail);
editTextMobile = findViewById(R.id.editTextMobile);
editTextOccupation = findViewById(R.id.editTextOccupation);
editTextAddress = findViewById(R.id.editTextAddress);
editTextNidBack = findViewById(R.id.editTextNidBack);
progressDialog = new ProgressDialog(RegisterActivity.this);
progressDialog.setMessage("Uploading Image. Please Wait");
progressDialog.setCancelable(false);
progressDialog.setMax(100);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
btnNidBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Dexter.withActivity(RegisterActivity.this)
.withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse response) {
CropImage.activity()
.setGuidelines(CropImageView.Guidelines.ON)
.start(RegisterActivity.this);
}
@Override
public void onPermissionDenied(PermissionDeniedResponse response) {
if(response.isPermanentlyDenied()){
AlertDialog.Builder builder = new AlertDialog.Builder(RegisterActivity.this);
builder.setTitle("Permission Required")
.setMessage("Permission to access your device storage is required to pick image. Please go to settings to enable storage permission to access storage")
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", getPackageName(), null));
startActivityForResult(intent, 51);
}
})
.setNegativeButton("Cancel", null)
.show();
}
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
token.continuePermissionRequest();
}
})
.check();
}
});
ibPick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Dexter.withActivity(RegisterActivity.this)
.withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse response) {
CropImage.activity()
.setGuidelines(CropImageView.Guidelines.ON)
.start(RegisterActivity.this);
}
@Override
public void onPermissionDenied(PermissionDeniedResponse response) {
if(response.isPermanentlyDenied()){
AlertDialog.Builder builder = new AlertDialog.Builder(RegisterActivity.this);
builder.setTitle("Permission Required")
.setMessage("Permission to access your device storage is required to pick image. Please go to settings to enable storage permission to access storage")
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", getPackageName(), null));
startActivityForResult(intent, 51);
}
})
.setNegativeButton("Cancel", null)
.show();
}
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
token.continuePermissionRequest();
}
})
.check();
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
CropImage.ActivityResult result = CropImage.getActivityResult(data);
CropImage.ActivityResult result2 = CropImage.getActivityResult(data);
if (resultCode == RESULT_OK) {
final Uri resultUri = result.getUri();
final Uri resultUri2 = result2.getUri();
civProfile.setImageURI(resultUri);
btnConfirm.setVisibility(View.VISIBLE);
btnSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String name = editTextName.getText().toString().trim();
final String email = editTextEmail.getText().toString().trim();
final String password = editTextPassword.getText().toString().trim();
final String phone = editTextMobile.getText().toString().trim();
final String address = editTextAddress.getText().toString().trim();
final String occupation = editTextOccupation.getText().toString().trim();
File imageFile = new File(resultUri.getPath());
File imageFile2 = new File(resultUri2.getPath());
progressDialog.show();
AndroidNetworking.upload(url)
.addMultipartFile("image1", imageFile)
.addMultipartFile("image2", imageFile2)
.addMultipartParameter("name", name)
.addMultipartParameter("email", email)
.addMultipartParameter("borrower_pass", password)
.addMultipartParameter("phone", phone)
.addMultipartParameter("address", address)
.addMultipartParameter("occupation", occupation)
.addMultipartParameter("id", String.valueOf(12))
.setPriority(Priority.HIGH)
.build()
.setUploadProgressListener(new UploadProgressListener() {
@Override
public void onProgress(long bytesUploaded, long totalBytes) {
float progress = (float) bytesUploaded / totalBytes * 100;
progressDialog.setProgress((int) progress);
}
})
.getAsString(new StringRequestListener() {
@Override
public void onResponse(String response) {
try {
progressDialog.dismiss();
JSONObject jsonObject = new JSONObject(response);
int status = jsonObject.getInt("status");
String message = jsonObject.getString("message");
if (status == 0) {
Toast.makeText(RegisterActivity.this, "Unable to upload image: " + message, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(RegisterActivity.this, message, Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(RegisterActivity.this, "Parsing Error", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onError(ANError anError) {
progressDialog.dismiss();
anError.printStackTrace();
Toast.makeText(RegisterActivity.this, "Error Uploading Image", Toast.LENGTH_SHORT).show();
}
});
}
});
} else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
Exception error = result.getError();
}
}
}
}
Я использую btnNidBack и ivPick для выбора файлов, но не понимаю, как передать их URL и хранить их в быстрой android сети. Это код php, который я использую.
<?php
require_once 'dbDetails.php';
$target_dir = "image/";
//Getting the server ip
$server_ip = gethostbyname(gethostname());
$upload_url = 'http://'.$server_ip.'/imageUpload/';
$target_file = $target_dir . time()."-".basename($_FILES["image"]["name"]);
$target_file2 = $target_dir . time()."-".basename($_FILES["nid_back"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file , PATHINFO_EXTENSION));
$imageFileType2 = strtolower(pathinfo($target_file2 , PATHINFO_EXTENSION));
$check = getimagesize($_FILES["image"]["tmp_name"]);
$response = array();
$error = "";
if($_SERVER['REQUEST_METHOD']=='POST'){
$email = $_POST['email'];
//$password = $_POST['password'];
$password = md5($_POST['borrower_pass']);
$name = $_POST['name'];
$phone = $_POST['phone'];
$address = $_POST['address'];
$occupation = $_POST['occupation'];
if($check != false){
$uploadOk = 1;
}
else{
$uploadOk = 0;
$error .= "Uploaded file is not a valid image. ";
}
if($imageFileType !="jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif"){
$uploadOk = 0;
$error .= "Image type is not supported";
}
else{
$uploadOk = 1;
$file_url = $upload_url.$target_file;
$file_url2 = $upload_url.$target_file2;
}
if($uploadOk == 0){
$response['status'] = 0;
$response['message'] = $error;
}
else{
$sql = "INSERT INTO borrower (name, email, borrower_pass, phone, address, occupation, image1, image2) VALUES ('$name','$email','$password','$phone','$address','$occupation','$file_url', '$file_url2');";
if(mysqli_query($conn,$sql)){
//filling response array with values
$response['error'] = false;
$response['image1'] = $file_url;
$response['image2'] = $file_url2;
$response['name'] = $name;
$response['email'] = $email;
$response['borrower_pass'] = $password;
$response['phone'] = $phone;
$response['address'] = $address;
$response['occupation'] = $occupation;
}
if(move_uploaded_file($_FILES["image"]["tmp_name"], $target_file) && move_uploaded_file($_FILES["nid_back"]["tmp_name"], $target_file2)){
$userId = $_POST["id"];
$response['status'] = 1;
$response['message'] = "Image uploaded successfully";
}
else{
$response['status'] = 0;
$response['message'] = "Unable to upload image to server";
}
}
echo json_encode($response);
}
?>
Я не понимаю, как написать код android и PHP для решения этой проблемы. Он загружает только один файл на сервер, но я хочу загрузить два файла на сервер одновременно.