Загрузите doc, pdf, xls и т. Д. Из приложения android на php-сервер

Я застреваю в этом месте и не могу отправить файл doc на php-сервер. Я использую этот код.

Вот PHP-код.

if($_SERVER['REQUEST_METHOD']=='POST'){ $image = $_POST['image']; $name = $_POST['name']; require_once('dbConnect.php'); $sql ="SELECT id FROM volleyupload ORDER BY id ASC"; $res = mysqli_query($con,$sql); $id = 0; while($row = mysqli_fetch_array($res)){ $id = $row['id']; } $path = "uploads/$id.doc"; $actualpath = "http://10.0.2.2/VolleyUpload/$path"; $sql = "INSERT INTO volleyupload (photo,name) VALUES ('$actualpath','$name')"; if(mysqli_query($con,$sql)){ file_put_contents($path,base64_decode($image)); echo "Successfully Uploaded"; } mysqli_close($con); }else{ echo "Error"; } 

Вот код Java

 private void showFileChooser() { Intent intent = new Intent(); intent.setType("file/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST); } 

Я вызвал asynTask на кнопку загрузки.

 if (v == buttonUpload) { // uploadImage(); new PostDataAsyncTask().execute(); } 

Вызов функции doInBackground

 private void postFile() { try { // the file to be posted String textFile = Environment.getExternalStorageDirectory() + "/Woodenstreet Doc.doc"; Log.v(TAG, "textFile: " + textFile); // the URL where the file will be posted String postReceiverUrl = "http://10.0.2.2/VolleyUpload/upload.php"; Log.v(TAG, "postURL: " + postReceiverUrl); // new HttpClient HttpClient httpClient = new DefaultHttpClient(); // post header HttpPost httpPost = new HttpPost(postReceiverUrl); File file = new File(filePath.toString()); FileBody fileBody = new FileBody(file); MultipartEntity reqEntity = new MultipartEntity( HttpMultipartMode.BROWSER_COMPATIBLE); reqEntity.addPart("file", fileBody); httpPost.setEntity(reqEntity); // execute HTTP post request HttpResponse response = httpClient.execute(httpPost); HttpEntity resEntity = response.getEntity(); if (resEntity != null) { String responseStr = EntityUtils.toString(resEntity).trim(); Log.v(TAG, "Response: " + responseStr); // you can add an if statement here and do other actions based // on the response } } catch (NullPointerException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } 

Исключением я получаю, что

 java.io.FileNotFoundException: content:/com.topnet999.android.filemanager/storage/0F02-250A/test.doc: open failed: ENOENT (No such file or directory) 

В эмуляторе есть файл test.doc. Есть ли какая-то вещь, которую я пропускаю в коде, пожалуйста, помогите мне. Или предложите учебник по загрузке pdf на php-сервер.

Заранее спасибо.

Вот решение моего вопроса: – Вот код php file – file.php

 <?php // DISPLAY FILE INFORMATION JUST TO CHECK IF FILE OR IMAGE EXIST echo '<pre>'; print_r($_FILES); echo '</pre>'; // DISPLAY POST DATA JUST TO CHECK IF THE STRING DATA EXIST echo '<pre>'; print_r($_POST); echo '</pre>'; $file_path = "images/"; $file_path = $file_path . basename( $_FILES['file']['name']); if(move_uploaded_file($_FILES['file']['tmp_name'], $file_path)) { echo "file saved success"; } else{ echo "failed to save file"; }?> 

Поместите этот файл в папку htdoc Xampp внутри теста с именем folder (если есть тестовая папка, то уже ok, иначе создайте папку с именем «test»). А также создайте папку с именем «images», в которой был сохранен загруженный файл.

Создать функцию для выбора файла из галереи

 private void showFileChooser() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("application/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); try { startActivityForResult( Intent.createChooser(intent, "Select a File to Upload"), 1); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(getActivity(), "Please install a File Manager.", Toast.LENGTH_SHORT).show(); } } 

Внутри функции onActivityResult

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1) { if (resultCode == Activity.RESULT_OK) { Uri selectedFileURI = data.getData(); File file = new File(selectedFileURI.getPath().toString()); Log.d("", "File : " + file.getName()); uploadedFileName = file.getName().toString(); tokens = new StringTokenizer(uploadedFileName, ":"); first = tokens.nextToken(); file_1 = tokens.nextToken().trim(); txt_file_name_1.setText(file_1); } } 

Это asyncTask для загрузки файла на сервер,

 public class PostDataAsyncTask extends AsyncTask<String, String, String> { protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(getActivity()); pDialog.setCancelable(false); pDialog.setMessage("Please wait ..."); showDialog(); } @Override protected String doInBackground(String... strings) { try { HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost("https://10.0.2.2/test/file.php"); file1 = new File(Environment.getExternalStorageDirectory(), file_1); fileBody1 = new FileBody(file1); MultipartEntity reqEntity = new MultipartEntity( HttpMultipartMode.BROWSER_COMPATIBLE); reqEntity.addPart("file1", fileBody1); httpPost.setEntity(reqEntity); HttpResponse response = httpClient.execute(httpPost); HttpEntity resEntity = response.getEntity(); if (resEntity != null) { final String responseStr = EntityUtils.toString(resEntity) .trim(); Log.v(TAG, "Response: " + responseStr); } } catch (NullPointerException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String result) { hideDialog(); Log.e("", "RESULT : " + result); } } 

Вызовите asyncTask при нажатии кнопки после выбора файла из галереи.

 btn_upload.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new PostDataAsyncTask().execute(); } }); 

Надеюсь, что это поможет вам. Счастливые помочь и счастливое кодирование.

Код ниже не протестирован (как есть), но, как правило, можно обрабатывать загрузку файла – там, как вы увидите, есть отладочная инструкция. Попробуйте отправить файл и посмотреть, что вы получите, если все лакки в порядке, прокомментируйте эту строку и скрестите пальцы.

  <?php /* Basic file upload handler - untested */ if( $_SERVER['REQUEST_METHOD']=='POST' && isset( $_FILES['image'] ) && !empty( $_FILES['image']['tmp_name'] ) ){ /* Assuming the field being POSTed is called `image`*/ $name = $_FILES['image']['name']; $size = $_FILES['image']['size']; $type = $_FILES['image']['type']; $tmp = $_FILES['image']['tmp_name']; /* debug:comment out if this looks ok */ exit( print_r( $_FILES,true ) ); $result = $status = false; $basename=pathinfo( $name, PATHINFO_FILENAME ); $filepath='http://10.0.2.2/VolleyUpload/'.$basename; $result=@move_uploaded_file( $tmp, $filepath ); if( $result ){ $sql = "insert into `volleyupload` ( `photo`, `name` ) values ( '$filepath', '$basename' )"; $status=mysqli_query( $con, $sql ); } echo $result && $status ? 'File uploaded and logged to db' : 'Something not quite right. Uploaded:'.$result.' Logged:'.$status; } ?> 
 java.io.FileNotFoundException: content:/com.topnet999.android.filemanager/storage/0F02-250A/test.doc: open failed: ENOENT (No such file or directory) 

У вас есть путь к поставщику контента. Не путь к файловой системе. Поэтому вы не можете использовать классы File ….

Вместо этого используйте

  InputStream is = getContentResolver().openInputStream(uri); 

В остальном ваш php-код не имеет смысла, поскольку при загрузке нет кодировки base64. Далее параметры $ path и $ actualpath не используются и запутываются. И вы не сказали, что должен делать ваш сценарий.