且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

通过API将文件从Android上传到laravel

更新时间:2023-01-16 16:05:25

找到了答案,我在这里添加代码

Found the answer, I'm adding the code here

Laravel:

public function uploadFileApp(Request $request){
    $response = array();
    $data = $request->all();
    $email = $data['email'];
    $po_number = $data['po_number'];

    //Event::fire(new SendMail($email));

    if($request->hasFile('uploaded_file')){
        $file = $request->file('uploaded_file');

        $f_name = $file->getClientOriginalName();
        $file_size = $file->getSize();
        $file_extension = $file->getClientOriginalExtension();

        $max_id = IndexScan::max('id');
        $tst_id = str_pad($max_id+ 1, 8, '0', STR_PAD_LEFT);

        $transaction_id = 'M-'.$tst_id;
        $new_file_name = $transaction_id.".".$file_extension;

        $destination_path = public_path('/images/files');
        //chmod($destination_path,0777);
        $file->move($destination_path,$new_file_name);

        $FileUpload = new FileUpload;

        $FileUpload->file_name = $new_file_name;
        $FileUpload->original_file_name = $f_name;
        $FileUpload->file_size = $file_size;
        $FileUpload->transaction_id = $transaction_id;
        $FileUpload->uploaded_by = $request->input("email");
        $FileUpload->save();

        $get_user_id = Users::where(['email'=>$email])->first();

        $IndexScan = new IndexScan;
        $IndexScan->transaction_id = $transaction_id;
        $IndexScan->doc_type = $get_user_id->doc_type;
        $IndexScan->po_number = $po_number;
        $IndexScan->status = 'Scanned';
        $IndexScan->scanned_by = $get_user_id->id;
        $IndexScan->to_be_indexed_by = $get_user_id->id;
        $IndexScan->status = 'Scanned';
        $IndexScan->source = 'Mobile App';
        $IndexScan->ip_address = request()->ip();
        $IndexScan->save();

        $response["success"] = 1;
        $response["transaction_id"] = $transaction_id;

    } else {
        $response["success"] = 0;
        $response["transaction_id"] = "0000000000";
    }
    return response()->json($response);
}

Android:

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.StrictMode;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.Volley;
import com.mazelon.invoiceassistant.Constants.Constants;
import com.mazelon.invoiceassistant.service.HttpHandler;
import com.mazelon.invoiceassistant.service.JSONParser;
import com.mazelon.invoiceassistant.service.VolleyMultipartRequest;
import com.scanlibrary.PickImageFragment;
import com.scanlibrary.ScanActivity;
import com.scanlibrary.ScanConstants;
import com.yarolegovich.lovelydialog.LovelyTextInputDialog;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import cz.msebera.android.httpclient.NameValuePair;
import cz.msebera.android.httpclient.message.BasicNameValuePair;

import static android.content.ContentValues.TAG;
import static android.content.Context.MODE_PRIVATE;
import static com.mazelon.invoiceassistant.Constants.Constants.BASE_URL;
import static com.mazelon.invoiceassistant.Constants.Constants.SharedPrefName;
import static com.mazelon.invoiceassistant.Constants.Constants.TAG_SUCCESS;
import static com.mazelon.invoiceassistant.Constants.Constants.email_str;
import static com.mazelon.invoiceassistant.Constants.Constants.password_str;
import static com.mazelon.invoiceassistant.Constants.Constants.username_str;

public class MyInvoices extends Fragment {

    private RecyclerView rvmyuploads;
    FloatingActionButton fab_add;
    private static final int REQUEST_CODE = 99;
    private ProgressDialog pDialog;
    File file;
    String upload_url = BASE_URL+"uploadFileApp";
    String fetch_url = BASE_URL+"appFetchUploads";
    JSONParser jsonParser = new JSONParser();
    private MyInvoicesAdapter myInvoicesAdapter;
    List<MyInvoicesAdapter.MyUploadsListing> itemListMyUploads = new ArrayList<>();
    String po_number = "";

    public MyInvoices(){}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        new myUploads().execute();
        View view =  inflater.inflate(R.layout.my_invoices, container, false);
        rvmyuploads = (RecyclerView) view.findViewById(R.id.rvmyuploads);
        pDialog = new ProgressDialog(getActivity());
        StrictMode.ThreadPolicy policy = new
                StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        return view;
    }

    @Override
    public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        setupFeed();
        fab_add = (FloatingActionButton) view.findViewById(R.id.fab_add);

        if (!isOnline(getActivity()))
        {
            Toast.makeText(getActivity(), "No network connection", Toast.LENGTH_LONG).show();
            return;
        }

        fab_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new LovelyTextInputDialog(getContext(), R.style.EditTextTintTheme)
                        .setTopColorRes(R.color.colorPrimary)
                        .setIcon(R.drawable.invoices)
                        .setIconTintColor(R.color.warning)
                        .setTitle("Enter PO Number : ")
                        .setConfirmButton(android.R.string.ok, new LovelyTextInputDialog.OnTextInputConfirmListener() {
                            @Override
                            public void onTextInputConfirmed(String text) {
                                po_number=text;
                                startScan(ScanConstants.OPEN_CAMERA);
                            }
                        })
                        .show();
            }
        });
    }

    private boolean isOnline(Context mContext) {
        ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnectedOrConnecting())
        {
            return true;
        }
        return false;
    }

    private void setupFeed() {
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext()) {
            @Override
            protected int getExtraLayoutSpace(RecyclerView.State state) {
                return 300;
            }
        };
        rvmyuploads.setLayoutManager(linearLayoutManager);

    }

    protected void startScan(int preference) {
        Intent intent = new Intent(getContext(), ScanActivity.class);
        intent.putExtra(ScanConstants.OPEN_INTENT_PREFERENCE, preference);
        startActivityForResult(intent, REQUEST_CODE);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
            Uri uri = data.getExtras().getParcelable(ScanConstants.SCANNED_RESULT);
            try {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);
                SharedPreferences sp = getActivity().getSharedPreferences(SharedPrefName, MODE_PRIVATE);
                String email = sp.getString(email_str,"");
                uploadBitmap(upload_url,email,bitmap);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public byte[] getFileDataFromDrawable(Bitmap bitmap) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
        return byteArrayOutputStream.toByteArray();
    }

    private class myUploads extends AsyncTask<Integer, Integer, Integer> {
        JSONObject json;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @RequiresApi(api = Build.VERSION_CODES.KITKAT)
        @Override
        protected Integer doInBackground(Integer... ints) {
            HttpHandler sh = new HttpHandler();

            SharedPreferences sp = getActivity().getSharedPreferences(SharedPrefName, MODE_PRIVATE);
            String email_id = sp.getString(email_str,"");

            String urls = "?email="+email_id;
            String jsonStr = sh.makeServiceCall(fetch_url+urls);

            Log.e(TAG, "Response from url: " + jsonStr);

            try {
                JSONArray arr = new JSONArray(jsonStr);

                for (int i = 0; i < arr.length(); i++) {
                    JSONObject o = arr.getJSONObject(i);

                    MyInvoicesAdapter.MyUploadsListing myuploadslist = new MyInvoicesAdapter.MyUploadsListing();
                    if (!o.isNull("transaction_id")) {
                        myuploadslist.transaction_id = o.getString("transaction_id");
                    }
                    if (!o.isNull("status")) {
                        myuploadslist.status = o.getString("status");
                    }
                    if (!o.isNull("created_at")) {
                        myuploadslist.created_at = o.getString("created_at");
                    }
                    itemListMyUploads.add(i, myuploadslist);

                    Log.e(TAG, "Items : " + itemListMyUploads);
                }
            } catch (final JSONException e) {
                Log.e(TAG, "Json parsing error: " + e.getMessage());

            }
            return null;
        }

        protected void onPostExecute(Integer result) {
            super.onPostExecute(result);
            myInvoicesAdapter = new MyInvoicesAdapter(getContext(), itemListMyUploads);
            myInvoicesAdapter.updateItem();
            rvmyuploads.setAdapter(myInvoicesAdapter);
            myInvoicesAdapter.notifyDataSetChanged();

            if(itemListMyUploads.size()==0){
                rvmyuploads.setVisibility(View.INVISIBLE);
            }
        }
    }

    private void uploadBitmap(String upload_url, final String email, final Bitmap bitmap) {
        pDialog.setMessage("Uploading, Please Wait...");
        pDialog.show();
        //our custom volley request
        VolleyMultipartRequest volleyMultipartRequest = new VolleyMultipartRequest(Request.Method.POST, upload_url,
                new Response.Listener<NetworkResponse>() {
                    @Override
                    public void onResponse(NetworkResponse response) {
                        try {
                            if(pDialog!=null) {
                                pDialog.dismiss();
                            }
                            JSONObject obj = new JSONObject(new String(response.data));
                            Log.e("TST ID :",obj.getString("transaction_id"));
                            Toast.makeText(getActivity(), "Transaction ID : "+obj.getString("transaction_id")+" Created Successfully", Toast.LENGTH_SHORT).show();
                            Intent intent = new Intent(getActivity(), UploadSuccess.class);
                            intent.putExtra("transaction_id",obj.getString("transaction_id"));
                            startActivity(intent);
                        } catch (JSONException e) {
                            if(pDialog!=null) {
                                pDialog.dismiss();
                            }
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        if(pDialog!=null) {
                            pDialog.dismiss();
                        }
                        Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                }) {

            /*
             * If you want to add more parameters with the image
             * you can do it here
             * here we have only one parameter with the image
             * which is tags
             * */
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("email", email);
                params.put("po_number", po_number);
                return params;
            }

            /*
             * Here we are passing image by renaming it with a unique name
             * */
            @Override
            protected Map<String, DataPart> getByteData() {
                Map<String, DataPart> params = new HashMap<>();
                long imagename = System.currentTimeMillis();
                params.put("uploaded_file", new DataPart(imagename + ".png", getFileDataFromDrawable(bitmap)));
                return params;
            }
        };

        //adding the request to volley
        Volley.newRequestQueue(getActivity()).add(volleyMultipartRequest);
    }

}