JSON和上传图像到服务器

时间:2022-09-03 21:21:28

i want to upload a image from android to my sql database, and i have a code like this :

我想从android上传一张图片到我的sql数据库,我有这样的代码:

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());
    }
}

but at the same time i want to upload my username too to my database(let's say i retreive the username using edittext), anyone know how to do that? what kind of code that i should add? thanks before

但同时我也想上传我的用户名到我的数据库中(假设我用edittext保存用户名),有人知道怎么做吗?我应该添加什么样的代码?由于之前

my table in database should be like this :

我的数据库表应该是这样的:

ID | Username | file |

ID |用户名|文件|

and the JSON code which i can use to upload string data is like this :

我可以用来上传字符串数据的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());
    }

can i combine these code? or is there another way to upload file and string at the same time from android? thanks before

我可以合并这些代码吗?还是有其他方法可以同时从android上传文件和字符串?由于之前

my php code :

我的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);

?>

2 个解决方案

#1


1  

In my approach I used org.apache.http.entity.mime.MultipartEntity and added passed the image file name as a FileBody

在我的方法中,我使用了org.apache.http.entity.mime。MultipartEntity并添加了以文件体形式传递的图像文件名

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

then pass the MultiPartEntity to the HttpPost. I haven't posted full code since its got loads of comments and code unrelated to your question. By passing the image as a FileBody it is possible to get the image using stand php file handling code (See Below).

然后将MultiPartEntity传递给HttpPost。我还没有发布完整的代码,因为它有大量与你的问题无关的评论和代码。通过将图像作为文件体传递,可以使用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;
          }

For my purpose the code above was in a loop as I was dealin with multiple images

出于我的目的,上面的代码是在一个循环中,因为我正在处理多个图像。

$im = 'image_' . $i;

refers to the name of the image in the entity.

指实体中图像的名称。

Sorry for the short post i'm rushed for time.

对不起,我赶时间。

Forgot to mention the reason why I didn't use the Base64 string approach is it limits the size of the image that you can send. The FileBody approach in the entity was the best approach I found.

忘了说我没有使用Base64字符串方法的原因是它限制了可以发送的图像的大小。实体中的FileBody方法是我发现的最佳方法。

You can pass strings using:

你可以使用:

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);

#2


0  

Yes you can, and you should, to minimise the number of calls you make to the server. Just add another parameter to your nameValuePairs with the appropriate data.

是的,你可以,你也应该,尽量减少你对服务器的呼叫次数。只需添加另一个参数到namepairs与适当的数据。

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

This is quite straight forward. What you should be looking at really is the server-side code as this needs to be able to handle the different pieces of data.

这是非常直接的。您应该真正关注的是服务器端代码,因为它需要能够处理不同的数据片段。

#1


1  

In my approach I used org.apache.http.entity.mime.MultipartEntity and added passed the image file name as a FileBody

在我的方法中,我使用了org.apache.http.entity.mime。MultipartEntity并添加了以文件体形式传递的图像文件名

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

then pass the MultiPartEntity to the HttpPost. I haven't posted full code since its got loads of comments and code unrelated to your question. By passing the image as a FileBody it is possible to get the image using stand php file handling code (See Below).

然后将MultiPartEntity传递给HttpPost。我还没有发布完整的代码,因为它有大量与你的问题无关的评论和代码。通过将图像作为文件体传递,可以使用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;
          }

For my purpose the code above was in a loop as I was dealin with multiple images

出于我的目的,上面的代码是在一个循环中,因为我正在处理多个图像。

$im = 'image_' . $i;

refers to the name of the image in the entity.

指实体中图像的名称。

Sorry for the short post i'm rushed for time.

对不起,我赶时间。

Forgot to mention the reason why I didn't use the Base64 string approach is it limits the size of the image that you can send. The FileBody approach in the entity was the best approach I found.

忘了说我没有使用Base64字符串方法的原因是它限制了可以发送的图像的大小。实体中的FileBody方法是我发现的最佳方法。

You can pass strings using:

你可以使用:

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);

#2


0  

Yes you can, and you should, to minimise the number of calls you make to the server. Just add another parameter to your nameValuePairs with the appropriate data.

是的,你可以,你也应该,尽量减少你对服务器的呼叫次数。只需添加另一个参数到namepairs与适当的数据。

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

This is quite straight forward. What you should be looking at really is the server-side code as this needs to be able to handle the different pieces of data.

这是非常直接的。您应该真正关注的是服务器端代码,因为它需要能够处理不同的数据片段。