我正在开发一个应用程序,用于将文件从Android应用程序上传到Laravel服务器,无法获取上传文件的特定方法。当我在Postman上测试时,它可以正常运行,但是通过Android,它无法正常工作 下面附上了Laravel代码:
public function uploadFileApp(Request $request){
$response = array();
$results = array();
if($request->hasFile('uploaded_file')){
$file = $request->file('uploaded_file');
$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->file_size = $file_size;
$FileUpload->transaction_id = $transaction_id;
$FileUpload->uploaded_by = $request->input("email");
$FileUpload->save();
$get_user_id = User::where(['email' => $request->input("email")])->first();
$IndexScan = new IndexScan;
$IndexScan->transaction_id = $transaction_id;
$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;
$results["results"] = $response;
} else {
$response["success"] = 0;
$response["transaction_id"] = "0000000000";
$results["results"] = $response;
}
return response()->json($results);
}
这是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.Bundle;
import android.os.Environment;
import android.os.StrictMode;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.scanlibrary.PickImageFragment;
import com.scanlibrary.ScanActivity;
import com.scanlibrary.ScanConstants;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
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 static android.content.Context.MODE_PRIVATE;
import static com.mazelon.invoiceassistant.Constants.Constants.BASE_URL;
import static com.mazelon.invoiceassistant.Constants.Constants.SharedPrefName;
public class MyInvoices extends Fragment {
FloatingActionButton fab_add;
private static final int REQUEST_CODE = 99;
private ProgressDialog pDialog;
File file;
String upload_url = BASE_URL+"uploadFileApp";
String tst_id = "";
public MyInvoices(){}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_invoices, container, false);
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);
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) {
startScan(ScanConstants.OPEN_CAMERA);
}
});
}
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;
}
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);
String file_nm = "";
Bitmap bitmap = null;
String email = "";
try {
String root = String.valueOf(Environment.getExternalStorageDirectory());
bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);
file_nm = PickImageFragment.file_name;
SharedPreferences sp = getActivity().getSharedPreferences(SharedPrefName, MODE_PRIVATE);
email = sp.getString("email","");
} catch (IOException e) {
e.printStackTrace();
}
uploadFile(upload_url,email,file_nm);
}
}
public void uploadFile(final String urlString, String vTitle, String filenm) {
URL connectURL = null;
String Title = null;
String fileName = null;
int serverResponseCode = 0;
try{
connectURL = new URL(urlString);
Title= vTitle;
fileName = filenm;
}catch(Exception ex){
Log.i("HttpFileUpload","URL Malformatted");
}
HttpURLConnection conn = null;
DataOutputStream dos = null;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1024 * 1024 * 1024;
File sourceFile = new File(Environment.getExternalStorageDirectory(), "/doc_flux" + "/" + fileName);
if (!sourceFile.isFile()) {
Log.e("uploadFile", "Source File not exist :" + fileName);
}
else {
try {
Log.e("url", String.valueOf(connectURL));
Log.e("email", Title);
Log.e("file_name", fileName);
// open a URL connection to the Servlet
FileInputStream fileInputStream = new FileInputStream(sourceFile);
// Open a HTTP connection to the URL
conn = (HttpURLConnection) connectURL.openConnection();
conn.setDoInput(true); // Allow Inputs
conn.setDoOutput(true); // Allow Outputs
conn.setUseCaches(false); // Don't use a Cached Copy
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("uploaded_file", fileName);
dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"email\"" + lineEnd);
dos.writeBytes(lineEnd);
dos.writeBytes(Title);
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\"" + fileName + "\"" + lineEnd);
dos.writeBytes(lineEnd);
// create a buffer of maximum size
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// read file and write it into form...
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
// send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// Responses from the server (code and message)
serverResponseCode = conn.getResponseCode();
String serverResponseMessage = conn.getResponseMessage();
Log.i("uploadFile", "HTTP Response is : "
+ serverResponseMessage + ": " + serverResponseCode);
if (serverResponseCode == 200) {
final HttpURLConnection finalConn = conn;
getActivity().runOnUiThread(new Runnable() {
public void run() {
BufferedReader in = null;
StringBuffer response = null;
try {
in = new BufferedReader(
new InputStreamReader(finalConn.getInputStream()));
String inputLine;
response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
Log.e("jsonreply",response.toString());
} catch (IOException e) {
e.printStackTrace();
}
try {
JSONObject mainObject = new JSONObject(response.toString());
JSONObject uniObject = mainObject.getJSONObject("results");
tst_id = uniObject.getString("transaction_id");
} catch (JSONException e) {
e.printStackTrace();
}
String msg = "File Upload Completed.";
Toast.makeText(getActivity(), msg,
Toast.LENGTH_SHORT).show();
}
});
Intent intent = new Intent(getActivity(), UploadSuccess.class);
intent.putExtra("transaction_id",tst_id);
startActivity(intent);
}
//close the streams //
fileInputStream.close();
dos.flush();
dos.close();
} catch (MalformedURLException ex) {
if(pDialog!=null) {
pDialog.dismiss();
}
ex.printStackTrace();
getActivity().runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getActivity(), "MalformedURLException",
Toast.LENGTH_SHORT).show();
}
});
Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
} catch (Exception e) {
if(pDialog!=null) {
pDialog.dismiss();
}
e.printStackTrace();
getActivity().runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getActivity(), "Got Exception : see logcat ",
Toast.LENGTH_SHORT).show();
}
});
Log.e("Upload server Exception", "Exception : "
+ e.getMessage(), e);
}
if(pDialog!=null) {
pDialog.dismiss();
}
}
}
}
当我使用邮递员的上述Laravel API服务的访问权限时,我的图像正在上传(我的意思是它正在通过if($ request-> hasFile('uploaded_file')),但是当我尝试通过上述android时代码,它不起作用(我是说它到达了else语句)。
答案 0 :(得分:-2)
找到了答案, 我在这里添加代码
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);
}
}