2016-04-12 23 views
0

我正在製作一個android應用程序,使用php在mySql數據庫中上傳圖像。該代碼工作正常,但是當我上傳更大的圖像像1 MB那麼它不起作用。它可以上傳的最大大小約爲600 KB。如何減少在Android上使用PHP上傳圖像的大小

所以我的問題是,我怎麼能壓縮圖像的大小,而上傳到服務器使用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 
+0

你爲什麼不做到這一點之前把它在Android的一面呢? –

+0

嘗試使用'bmp.compress(Bitmap.CompressFormat.JPEG,5,baos);'並檢查.. – Mohit

+0

看看http://stackoverflow.com/questions/18573774/how-to-reduce-an-image-文件大小之前上傳到服務器 – Radhey

回答

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:用於寫入壓縮數據的輸出流。

其中format,quanlity是你在哪裏尋找......所以,因爲我已經評論過嘗試。

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

查找JPEG,PNG,GIF之間的進一步區別:

StackOverflow

+0

thanx這個信息可能會對其他人有幫助。 –

+0

你好,先生.. – Mohit

相關問題