2016-11-14 123 views
2

告诉我,我发送到服务器的文本+文件。文件 - 照片。清单中注册了必要的权限。文件不会上传到服务器使用库Volley(android/php)

**服务器的文本接收**,但服务器没有收到文件。请帮助我发送文件和文本。 的代码PHP网页良好的工作,我从一个浏览器和文字+测试文件接收

更新: 我考虑到了所有的意见和修改后的代码,照片还没有得到服务器 当我挑照片图库我看到我的标签日志

11-15 15:24:45.583 7942-7942/com.handlingcitizen.handlingcitizen E/GetpathImageGalery: Cool/storage/emulated/0/DCIM/Camera/20161113090426.jpg 

重点:

public static final String KEY_IMAGE = "fileFF"; 
public static final String KEY_IMAGE_NAME = "name"; 
public static final String KEY_NAME = "nameFF"; 
public static final String KEY_EMAIL = "contactFF"; 
public static final String KEY_NASELPUNKT = "gorodFF"; 
public static final String KEY_DOM = "homeFF"; 
public static final String KEY_STREET = "streetFF"; 
public static final String KEY_MESAGES = "messageFF"; 

上传文件:

private void openGalery() { 
    if (checker.lacksPermissions(PERMISSIONS_READ_STORAGE)) { 
     startPermissionsActivity(PERMISSIONS_READ_STORAGE); 
    } else { 
     Intent galleryIntent = new Intent(Intent.ACTION_PICK, 
       android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
     // Start the Intent 
     startActivityForResult(galleryIntent, PICK_IMAGE_REQUEST); 
    } 
} 

private void opnenCamera() { 

    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    // Ensure that there's a camera activity to handle the intent 
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
     // Create the File where the photo should go 
     File photoFile = null; 
     try { 
      photoFile = createImageFile(); 
     } catch (IOException ex) { 
      // Error occurred while creating the File 
      ex.printStackTrace(); 
     } 
     // Continue only if the File was successfully created 
     if (photoFile != null) { 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, 
        Uri.fromFile(photoFile)); 
      startActivityForResult(takePictureIntent, CAPTURE_IMAGE); 
     } 
    } 
} 

private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = timeStamp + "_"; 
    File storageDir = Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES); 

    File image = File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 

    // Save a file: path for use with ACTION_VIEW intents 
    mCurrentPhotoPath = image.getAbsolutePath(); 
    Log.e("Getpath", "Cool" + mCurrentPhotoPath); 
    return image; 
} 


public String getPath(Uri uri) { 
    String[] projection = {MediaStore.Images.Media.DATA}; 
    Cursor cursor = managedQuery(uri, projection, null, null, null); 
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == PICK_IMAGE_REQUEST && data != null && requestCode == 1) { 
     filePath = data.getData(); 
     try { 
      int targetWi = imageViewUppload.getWidth(); 
      int targetHi = imageViewUppload.getHeight(); 
      BitmapFactory.Options bmOptionsgalery = new BitmapFactory.Options(); 

      bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath); 

      //Setting the Bitmap to ImageView 
      filename = filePath.getLastPathSegment(); 


      BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptionsgalery); 
      int photoW = bmOptionsgalery.outWidth; 
      int photoH = bmOptionsgalery.outHeight; 
      int scaleFactor = Math.min(photoW/targetWi, photoH/targetHi); 

      // Decode the image file into a Bitmap sized to fill the View 
      bmOptionsgalery.inJustDecodeBounds = false; 
      bmOptionsgalery.inSampleSize = scaleFactor; 
      bmOptionsgalery.inPurgeable = true; 

      Bitmap bitmaptoimge = BitmapFactory.decodeFile(getPath(filePath), bmOptionsgalery); 
      Log.e("GetpathImageGalery", "Cool" + getPath(filePath)); 
      imageViewUppload.setImageBitmap(bitmaptoimge); 

      Toast.makeText(MainActivity.this, "Фото сохранено и выбрано!", 
        Toast.LENGTH_LONG).show(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    if (requestCode == CAPTURE_IMAGE && resultCode == RESULT_OK) { 


     // Get the dimensions of the View 
     int targetW = imageViewUppload.getWidth(); 
     int targetH = imageViewUppload.getHeight(); 

     // Get the dimensions of the bitmap 
     BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
     bmOptions.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); 
     int photoW = bmOptions.outWidth; 
     int photoH = bmOptions.outHeight; 

     // Determine how much to scale down the image 
     int scaleFactor = Math.min(photoW/targetW, photoH/targetH); 

     // Decode the image file into a Bitmap sized to fill the View 
     bmOptions.inJustDecodeBounds = false; 
     bmOptions.inSampleSize = scaleFactor; 
     bmOptions.inPurgeable = true; 

     Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); 
     imageViewUppload.setImageBitmap(bitmap); 
    } else { 
     showError("Вы не выбрали файл"); 
    } 


} 



private void bottomnavigation(Bundle savedInstanceState) { 

    bottomBar = BottomBar.attach(this, savedInstanceState); 
    bottomBar.setItemsFromMenu(R.menu.bottomnavigationview, new OnMenuTabSelectedListener() { 
     @Override 
     public void onMenuItemSelected(int itemId) { 
      switch (itemId) { 
       case R.id.action_1: 
        opnenCamera(); 

        break; 
       case R.id.action_2: 
        openGalery(); 
        break; 

      } 
     } 
    }); 
} 

public void showError(String errorMessage) { 
    Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT).show(); 
} 



public void uploadImage() { 
    if (checker.lacksPermissions(PERMISSIONS_INTERNET)) { 
     startPermissionsActivity(PERMISSIONS_INTERNET); 
    } else { 

     //Showing the progress dialog 
     final ProgressDialog loading = 
       ProgressDialog.show(this, "Uploading...", "Please wait...", false, false); 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, UPLOAD_URL, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String s) { 
         //Disimissing the progress dialog 
         loading.dismiss(); 
         //Showing toast message of the response 
         String otvet = null; 
         try { 
          otvet = URLDecoder 
            .decode(URLEncoder.encode(s, "iso8859-1"), "UTF-8"); 
         } catch (UnsupportedEncodingException e) { 
          e.printStackTrace(); 
         } 
         Toast.makeText(MainActivity.this, otvet, Toast.LENGTH_LONG).show(); 
        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError volleyError) { 
       //Dismissing the progress dialog 
       loading.dismiss(); 

       //Showing toast 
       String error = volleyError.toString(); 
       Toast.makeText(MainActivity.this, error, Toast.LENGTH_LONG).show(); 
       if (volleyError.networkResponse == null) { 
        if (volleyError.getClass().equals(TimeoutError.class)) { 
         // Show timeout error message 
         Toast.makeText(MainActivity.this, "Oops. Timeout error!", 
           Toast.LENGTH_LONG).show(); 
        } 
       } 

      } 
     }) { 
      @RequiresApi(api = Build.VERSION_CODES.KITKAT) 
      @Override 
      protected Map<String, String> getParams() throws AuthFailureError { 

       //Getting Image Name 
       name = nameFF.getText().toString().trim(); 
       //озвращает строку с вырезанными пробельными символами 

       naselpunkt = naspunkt.getText().toString().trim(); 

       street = ulica.getText().toString().trim(); 

       house = dom.getText().toString().trim(); 

       e_mail = email.getText().toString().trim(); 

       message = mesages.getText().toString().trim(); 

       //Creating parameters 
       Map<String, String> params = new Hashtable<String, String>(); 

       //Adding parameters 

       params.put(KEY_IMAGE, getPath(filePath)); 
       params.put(KEY_NAME, name); 
       params.put(KEY_NASELPUNKT, naselpunkt); 
       params.put(KEY_STREET, street); 
       params.put(KEY_DOM, house); 
       params.put(KEY_EMAIL, e_mail); 
       params.put(KEY_MESAGES, message); 

       //returning parameters 
       return params; 

      } 
     }; 

     //Creating a Request Queue 
     RequestQueue requestQueue = Volley.newRequestQueue(this); 

     //Adding request to the queue 
     requestQueue.add(stringRequest); 
    } 
} 

PHP代码:

<?php 
if (isset ($_POST['contactFF'])) { 
    $to = "ukpmo"; // поменять на свой электронный адрес 
    $from = $_POST['contactFF']; 
    $subject = "Заполнена контактная форма с ".$_SERVER['HTTP_REFERER']; 
    $message = "Фамилия, собственное имя, отчество (если таковое имеется) либо инициалы гражданина: \n".$_POST['nameFF']. 
    "\nНаселенный пункт: ".$_POST['gorodFF']. 
    "\nУлица: ".$_POST['streetFF']. 
    "\nдом, квартира/офис: ".$_POST['homeFF']. 
    "\nEmail: ".$from. 
    "\nДата отправки сообщения: ".$date_today = date("d.m.Y H:i"). 
    "\nИзложение сути обращения: ".$_POST['messageFF']; 

    $boundary = md5(date('r', time())); 
    $filesize = ''; 
    $headers = "MIME-Version: 1.0\r\n"; 
    $headers .= "From: " . $from . "\r\n"; 
    $headers .= "Reply-To: " . $from . "\r\n"; 
    $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; 
    $message=" 
Content-Type: multipart/mixed; boundary=\"$boundary\" 

--$boundary 
Content-Type: text/plain; charset=\"utf-8\" 
Content-Transfer-Encoding: 7bit 

$message"; 
    for($i=0;$i<count($_FILES['fileFF']['name']);$i++) { 
    if(is_uploaded_file($_FILES['fileFF']['tmp_name'][$i])) { 
     $attachment = chunk_split(base64_encode(file_get_contents($_FILES['fileFF']['tmp_name'][$i]))); 
     $filename = $_FILES['fileFF']['name'][$i]; 
     $filetype = $_FILES['fileFF']['type'][$i]; 
     $filesize += $_FILES['fileFF']['size'][$i]; 
     $message.=" 

--$boundary 
Content-Type: \"$filetype\"; name=\"$filename\" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment; filename=\"$filename\" 

$attachment"; 
    } 
    } 
    $message.=" 
--$boundary--"; 

    if ($filesize < 10000000) { // проверка на общий размер всех файлов. Многие почтовые сервисы не принимают вложения больше 10 МБ 
    mail($to, $subject, $message, $headers); 
    echo $_POST['nameFF'].', Ваше сообщение получено, спасибо!'; 
    } else { 
    echo 'Извините, письмо не отправлено. Размер всех файлов превышает 10 МБ.'; 
    } 
} 
?> 

文件上传代码和文本通过浏览器:

Request URL:http://dfg.by/wp-content/themes/reverie-master/contacts.php 
Request Method:POST 
Status Code:200 OK 
Remote Address:148.114.138.185:80 
Response Headers 
view parsed 
HTTP/1.1 200 OK 
Date: Thu, 03 Nov 2016 17:39:00 GMT 
Server: Apache 
X-Powered-By: PHP/5.4.45 
Connection: close 
Transfer-Encoding: chunked 
Content-Type: text/html 
Request Headers 
view parsed 
POST /wp-content/themes/reverie-master/contacts.php HTTP/1.1 
Host: ukp.mogilev.by 
Connection: keep-alive 
Content-Length: 47014 
Origin: http://ukp.mogilev.by 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36 
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryLgacUgprclABmklr 
Accept: */* 
DNT: 1 
Referer: http://ukp.mogilev.by/elektronnye-obrashcheniya-grazhdan/ 
Accept-Encoding: gzip, deflate 
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 
Cookie: _ym_uid=1478194399500303049; _ym_isad=1; _ym_visorc_28369546=w 
Request Payload 
------WebKitFormBoundaryLgacUgprclABmklr 
Content-Disposition: form-data; name="nameFF" 

тест 
------WebKitFormBoundaryLgacUgprclABmklr 
Content-Disposition: form-data; name="gorodFF" 

тест 
------WebKitFormBoundaryLgacUgprclABmklr 
Content-Disposition: form-data; name="streetFF" 

тест 
------WebKitFormBoundaryLgacUgprclABmklr 
Content-Disposition: form-data; name="streetFF" 

тест 
------WebKitFormBoundaryLgacUgprclABmklr 
Content-Disposition: form-data; name="streetFF" 

[email protected] 
------WebKitFormBoundaryLgacUgprclABmklr 
Content-Disposition: form-data; name="messageFF" 

тест 
------WebKitFormBoundaryLgacUgprclABmklr 
Content-Disposition: form-data; name="fileFF[]"; filename="3.jpg" 
Content-Type: image/jpeg 


------WebKitFormBoundaryLgacUgprclABmklr 
Content-Disposition: form-data; name="fileFF[]"; filename="" 
Content-Type: application/octet-stream 


------WebKitFormBoundaryLgacUgprclABmklr-- 

回答

1
params.put(KEY_IMAGE, image); 

相同

params.put("fileFF", image); 

这在你的CAS e是

params.put("fileFF", a base64 encoded string containing an image); 

因此,您不是以通常方式发送文件,而只是发送POST参数。

在你的PHP schript你可以得到的文件与含量研究:

$image = base64_decode($_POST['fileFF']); 
+0

,请告诉我,我需要改变吗? –

+0

我已经告诉过你了。 – greenapps

+0

如何正确发送文件? 服务器是不是我的,我不能改变任何东西 –