如何使用php减少在Android上传时图像的大小

时间:2016-04-12 14:01:31

标签: php android

我正在制作一个Android应用程序,使用php在mySql数据库中上传图像。代码工作正常但是当我上传更大尺寸的图像(如1 MB)时,它无法正常工作。它可以上传的最大大小约为600 KB。

所以我的问题是,如何在使用php将图像上传到服务器时压缩图像的大小。

我的php代码是

<?php
if($_SERVER['REQUEST_METHOD']=='POST'){

$photo= $_POST['photo'];
$bookname=$_POST['bookname'];
        $phoneNumber=$_POST['phoneNumber'];
        $price=$_POST['price'];

require_once('loginConnect.php');

$sql ="SELECT id FROM images ORDER BY id ASC";

$res = mysqli_query($con,$sql);

$id = 0;

while($row = mysqli_fetch_array($res)){
        $id = $row['id'];
}



         $path = "uploads/$id.png";
$actualpath = "http://www.bsservicess.com/photoUpload/$path";

$sql = "INSERT INTO images (photo,bookname,phoneNumber,price) VALUES
('$actualpath','$bookname','$phoneNumber','$price')";

if(mysqli_query($con,$sql)){
    file_put_contents($path,base64_decode($photo));
    echo "Successfully Uploaded";
}

mysqli_close($con);
}else{
echo "Error";
}
?>

我的Android活动代码是

 package com.manali.vivek.userregistration;

import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v7.app.ActionBarActivity;
import android.util.Base64;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;


public class image extends ActionBarActivity implements View.OnClickListener 
{

public static final String UPLOAD_URL =  
"http://www.bsservicess.com/photoUpload/uploadImage.php"; 
public static final String UPLOAD_KEY = "photo";

private int PICK_IMAGE_REQUEST = 1;

private Button buttonChoose;
private Button buttonUpload;
private Button buttonView;

private ImageView imageView;

private Bitmap bitmap;

private Uri filePath;
EditText et1, et2, et3;


protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image);

buttonChoose = (Button) findViewById(R.id.buttonChoose);
buttonUpload = (Button) findViewById(R.id.buttonUpload);
buttonView = (Button) findViewById(R.id.buttonViewImage);
et1 = (EditText) findViewById(R.id.et1);
et2 = (EditText) findViewById(R.id.et2);
et3 = (EditText) findViewById(R.id.et3);
imageView = (ImageView) findViewById(R.id.imageView);

buttonChoose.setOnClickListener(this);
buttonUpload.setOnClickListener(this);
buttonView.setOnClickListener(this);




}

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


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

if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data
!= null && data.getData() != null) {

    filePath = data.getData();
    try {
        bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(),
    filePath);
        imageView.setImageBitmap(bitmap);
    } catch (IOException e) {
        e.printStackTrace();
    }
} 
}

  public String getStringImage(Bitmap bmp) {
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 10, baos);
   byte[] imageBytes = baos.toByteArray();


       String encodedImage = Base64.encodeToString(imageBytes, 
     Base64.DEFAULT);
       return encodedImage;
      }


      private void uploadImage() {


         class UploadImage extends AsyncTask<Bitmap, Void, String> {

        ProgressDialog loading;
       RequestHandler rh = new RequestHandler();

      @Override
      protected void onPreExecute() {
        super.onPreExecute();
        loading = ProgressDialog.show(image.this, "Uploading Image",
     "Please wait...", true, true);
     }

     @Override
     protected void onPostExecute(String s) {
        super.onPostExecute(s);
        loading.dismiss();
        Toast.makeText(getApplicationContext(), s, 
    Toast.LENGTH_LONG).show();
     }

     @Override
     protected String doInBackground(Bitmap... params) {

        Bitmap bitmap = params[0];
        String uploadImage = getStringImage(bitmap);
        String bookname = et1.getText().toString();
        String phoneNumber = et2.getText().toString();
        String price = et3.getText().toString();

        HashMap<String, String> data = new HashMap<>();
        data.put(UPLOAD_KEY, uploadImage);

        data.put(Fetch.BOOK_NAME, bookname);
        data.put(Fetch.PHONE_NUMBER, phoneNumber);
        data.put(Fetch.PRICE, price);


        String result = rh.sendPostRequest(UPLOAD_URL, data);

        return result;
    }

 }

 UploadImage ui = new UploadImage();

 ui.execute(bitmap);

}


@Override
public void onClick(View v) {
if (v == buttonChoose) {
    showFileChooser();
}
if (v == buttonUpload) {
    uploadImage();
}


if (v == buttonView) {
    viewImage();
 }
}


private void viewImage() {
startActivity(new Intent(image.this, Main.class));
}


 ///////toolbar

 }

I have try everything but nothing works so plz help me

1 个答案:

答案 0 :(得分:0)

当我们在PNG中压缩文件大小时更是如此。所以最好在文件压缩中使用JPEG ..

  

压缩文件大小到来之后this source suggests是此顺序(升序)

     

24位JPG压缩,8位GIF,8位PNG,全质量24位JPG和24位PNG。

Document.compress (format,quality,stream)有三个参数..

  

格式:JPEG,PNG,WEBP

     

质量:0-100。 0表示压缩小尺寸,100表示​​压缩以获得最高质量

     

stream:OutputStream:写入压缩数据的输出流。

其中formatquanlity就是你要找的地方......所以我评论过试试。

bmp.compress(Bitmap.CompressFormat.JPEG, 5, baos);

寻找JPEG,PNG,GIF之间的进一步区别:

StackOverflow