2011-09-15 102 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