2011-09-15 157 views
2

我想從Android上的圖像上傳到我的SQL數據庫,我有這樣的代碼:JSON和上傳圖像到服務器

private void uploadFile() { 
    // TODO Auto-generated method stub 
    Bitmap bitmapOrg= BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath() +"/Chart1.png"); 
    ByteArrayOutputStream bao = new ByteArrayOutputStream(); 
    bitmapOrg.compress(Bitmap.CompressFormat.JPEG, 90, bao); 
    byte [] ba = bao.toByteArray(); 
    String ba1=Base64.encodeBytes(ba); 
    ArrayList nameValuePairs = new 
    ArrayList(); 
    nameValuePairs.add(new BasicNameValuePair("image",ba1)); 
    try{ 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new 
    HttpPost("http://ipadress/base.php"); 
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity entity = response.getEntity(); 
    is = entity.getContent(); 
    }catch(Exception e){ 
    Log.e("log_tag", "Error in http connection "+e.toString()); 
    } 
} 

,但在同一時間,我要上傳我的用戶名太我的數據庫(假設我使用edittext檢索用戶名),任何人都知道如何做到這一點?我應該添加什麼樣的代碼?由於之前

我的數據庫表應該是這樣的:

ID |用戶名|文件|

,並且我可以用它來上傳字符串數據的JSON代碼是這樣的:

private void uploadFile() { 
    // TODO Auto-generated method stub 
    String nama = getIntent().getStringExtra("user"); 
    Bitmap bitmapOrg= BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath() +"/Chart1.png"); 
    ByteArrayOutputStream bao = new ByteArrayOutputStream(); 
    bitmapOrg.compress(Bitmap.CompressFormat.JPEG, 90, bao); 
    byte [] ba = bao.toByteArray(); 
    String ba1=Base64.encodeBytes(ba); 
    ArrayList nameValuePairs = new ArrayList(); 
    nameValuePairs.add(new BasicNameValuePair("image",ba1)); 
    nameValuePairs.add(new BasicNameValuePair("username",nama)); 
    try{ 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new 
    HttpPost("http://139.195.144.67/BloodGlucose/base2.php"); 
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity entity = response.getEntity(); 
    is = entity.getContent(); 

    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
    HttpResponse httpRespose = httpclient.execute(httppost); 
    HttpEntity httpEntity = httpRespose.getEntity(); 
    InputStream in = httpEntity.getContent(); 
    BufferedReader read = new BufferedReader(new InputStreamReader(in)); 

    String isi= ""; 
    String baris= ""; 

    while((baris = read.readLine())!=null){ 
     isi+= baris; 
    } 

     //Jika isi tidak sama dengan "null " maka akan tampil Toast "Register Success" sebaliknya akan tampil "Register Failure" 
     if(!isi.equals("null")){     
      Toast.makeText(this, "Register Success", Toast.LENGTH_LONG).show(); 
     }else{ 
      Toast.makeText(this, "Register Failure", Toast.LENGTH_LONG).show(); 
     } 

    }catch(Exception e){ 
    Log.e("log_tag", "Error in http connection "+e.toString()); 
    } 

我可以將這些代碼?或者有另一種方式來從android同時上傳文件和字符串?由於之前

我的PHP代碼:

<?php 
include_once("koneksi.php"); 

$username = $_REQUEST['username']; 

$hasil = mysql_query("select (max(ID)+1)as newid from userownfile"); 
$row = mysql_fetch_row($hasil); 

$base = $_REQUEST['image']; 
$filename = $row[0] . ".jpg"; 
$buffer=base64_decode($base); 
$path = "img/".$filename.".jpg"; 
$handle = fopen($path, 'wb'); 
$numbytes = fwrite($handle, $buffer); 
fclose($handle); 
$conn=mysql_connect("localhost","root",""); 
mysql_select_db("db_bloodglucose"); 


$sql = "insert into userownfile(username,file) values('$username','" . $path . "')"; 
mysql_query($sql); 


$string= "select * from userownfile"; 
$my_string= mysql_query($string); 
if($my_string){ 
    while($object= mysql_fetch_assoc($my_string)){ 
     $output[] = $object; 
    } 

    echo json_encode($output); 

?> 

回答

1

在我的方法,我用org.apache.http.entity.mime.MultipartEntity並添加通過圖像文件名作爲FileBody

entity.addPart("image_" + photo_count, new FileBody(
         new File(failed.getFilenames()[i]))); 

然後通過MultiPartEntity到HttpPost。我沒有發佈完整的代碼,因爲它有大量的評論和代碼與您的問題無關。通過將圖像作爲FileBody傳遞,可以使用stand php文件處理代碼來獲取圖像(參見下文)。

if ((!empty($_FILES[$im])) && ($_FILES[$im]['error'] == 0)) { 
       $newname = dirname(__FILE__) . '/../photo/' . $campaign . '/' . $fn; 
       if (!file_exists($newname)) { 
        if (move_uploaded_file($_FILES[$im]['tmp_name'], $newname)) { 
         //$resp = "The file " . $fn . " has been uploaded"; 
         //printf("%s", $resp); 
        } else { 
        $error = $error + 1;  
        } 
       }else{ 
       //image file already exists 
       $error = $error + 1; 
       } 
      } else { 
       $error = $error +1; 
      } 

對於我的目的,上面的代碼是在一個循環中,因爲我用多個圖像

$im = 'image_' . $i; 

指的是在該實體的圖像的名稱的戲份。

對不起,短時間我衝了一段時間。

忘了提及我沒有使用Base64字符串方法的原因是它限制了您可以發送的圖像的大小。實體中的FileBody方法是我發現的最佳方法。

可以使用通過字符串:

entity.addPart("address", new StringBody(failed[0].getAddress())); 

HttpClient client = new DefaultHttpClient(); 
HttpConnectionParams.setConnectionTimeout(client.getParams(), 20000); // Timeout 

MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
entity.addPart("address", new StringBody("my address example")); 
entity.addPart("image_0", new FileBody(new File("filename of image"))); 

HttpPost post = new HttpPost("server address"); 
post.setEntity(entity); 

HttpResponse response = client.execute(post); 
+0

我以前從未使用過這個,所以我不知道如何做到這一點,你能告訴我一個完整的例子嗎?在此之前感謝 – Handy

+0

我編輯了答案,向您展示瞭如何使用帶有MultiPartEntity的HttpPost。從這裏獲取jar文件http://www.docjar.com/jar_detail/httpmime-4.0.1.jar.html – Bear

+0

@Bear我很好奇Base64的圖像大小限制。爲什麼會有一個? –

0

是的,你可以,你應該,最大限度地減少您對服務器的呼叫數量。只需使用適當的數據將另一個參數添加到nameValuePairs即可。

nameValuePairs.add(new BasicNameValuePair("image", image)); 
nameValuePairs.add(new BasicNameValuePair("username", username)); 

這很直截了當。你應該看到的確實是服務器端代碼,因爲它需要能夠處理不同的數據。

+0

所以我只是用我的JSON的代碼,是不是?我一直在添加我的PHP代碼。這是正確的?如果它不正確,我應該放什麼樣的代碼?在此之前感謝 – Handy

+0

我不是PHP專家,但它看起來像你有正確的想法(從POST對象中獲取正確的參數)。 –

+0

我編輯了我的JSON代碼,是這樣嗎?之前感謝 – Handy