将图像从android上传到PHP服务器

Uploading Image from android to PHP server(将图像从android上传到PHP服务器)
本文介绍了将图像从android上传到PHP服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

在我的应用程序中,我正在将图像从我的设备上传到本地网络服务器...执行代码后,会在服务器中创建一个 .jpg 文件,但不会打开它.并且服务器中文件的大小与原始文件不同.

In my app i am uploading an image from my device to a local web server... after executing the code a .jpg file gets created in the server but it does not gets opened. And the size of the file in server is different from the original file.

Android 活动:--

public class MainActivity extends Activity {


private static int RESULT_LOAD_IMAGE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button btnSelectImage=(Button) findViewById(R.id.uploadButton);
    btnSelectImage.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

        Intent i=new   Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

        startActivityForResult(i, RESULT_LOAD_IMAGE);

        }
    });

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && data!=null) {

        Uri selectedImage=data.getData();
        String[] filePathColumn={MediaStore.Images.Media.DATA};

        Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();


        Bitmap bitmap=BitmapFactory.decodeFile(picturePath);

        ImageView im = (ImageView) findViewById(R.id.imgBox);
        im.setImageBitmap(bitmap);

        /*
         * Convert the image to a string
         * */
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); //compress to which format you want.
        byte [] byte_arr = stream.toByteArray();
        String image_str = Base64.encodeToString(byte_arr,Base64.DEFAULT);

        /*
         * Create a name value pair for the image string to be passed to the server
         * */
        ArrayList<NameValuePair> nameValuePairs = new  ArrayList<NameValuePair>();            
        nameValuePairs.add(new BasicNameValuePair("image",image_str));


        JSONObject jsonString=new JSONObject();
        try {
            jsonString.put("img", image_str);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        new uploadImageToPhp().execute(jsonString);



    }


}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);


    return true;
}
public class uploadImageToPhp extends AsyncTask<JSONObject, Void, Void>
{
    String dataToSend=null;

    public static final String prefix="http://";                                                        //prefix of the urls
    public static final String server_ip="172.16.26.155";                                                   //the ip address where the php server is located    

    public static final String completeServerAddress=prefix+server_ip+"/test_upload/upload_image.php";                  //Exact location of the php files

    @Override
    protected Void doInBackground(JSONObject... params) {

        dataToSend="image="+params[0];
        communicator(completeServerAddress, dataToSend);




        return null;
    }

    public void communicator(String urlString,String dataToSend2)
    {
        String result=null;

        try
        {
            URL url=new URL(urlString);
            URLConnection conn=url.openConnection();

            HttpURLConnection httpConn=(HttpURLConnection) conn;
            httpConn.setRequestProperty("Accept", "application/json");
            httpConn.setRequestProperty("accept-charset", "UTF-8");
            httpConn.setRequestMethod("POST");         
            httpConn.connect();

            //Create an output stream to send data to the server
            OutputStreamWriter out=new OutputStreamWriter(httpConn.getOutputStream());
            out.write(dataToSend2);
            out.flush();

            int httpStatus = httpConn.getResponseCode();            
            System.out.println("Http status :"+httpStatus);

            if(httpStatus==HttpURLConnection.HTTP_OK)
            {
                Log.d("HTTP STatus", "http connection successful");

                BufferedReader in = new BufferedReader(new InputStreamReader(httpConn.getInputStream(),"UTF-8"));
                StringBuilder sb = new StringBuilder();
                String inputLine;
                while ((inputLine = in.readLine()) != null)
                {
                    System.out.println(inputLine);
                    sb.append(inputLine+"
");
                }
                in.close();
                result=sb.toString();                       

                try
                {

                    //jsonResult = new JSONObject(result);
                }
                catch(Exception e)
                {
                     Log.e("JSON Parser", "Error parsing data " + e.toString());
                }


            }
            else
            {
                System.out.println("Somthing went wrong");
            }
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }


}

}

PHP 代码:-

 $recievedJson=$_REQUEST['image'];
$imageContent=json_decode($recievedJson,true);
 $base=$imageContent["img"];

 $binary=base64_decode($base);

 echo $binary;
header('Content-Type: bitmap; charset=utf-8');
$file = fopen('uploaded_image.jpg', 'wb');
fwrite($file, $binary);
fclose($file);

推荐答案

使用下面的代码.它会做同样的事情.

Use below code. It will do the same.

public class UploadImage extends Activity {
    InputStream inputStream;
        @Override
    public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            setContentView(R.layout.main);

            Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.icon);           ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); //compress to which format you want.
            byte [] byte_arr = stream.toByteArray();
            String image_str = Base64.encodeBytes(byte_arr);
            ArrayList<NameValuePair> nameValuePairs = new  ArrayList<NameValuePair>();

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

             Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                  try{
                         HttpClient httpclient = new DefaultHttpClient();
                         HttpPost httppost = new HttpPost("server-link/folder-name/upload_image.php");
                         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                         HttpResponse response = httpclient.execute(httppost);
                         String the_string_response = convertResponseToString(response);
                         runOnUiThread(new Runnable() {

                                @Override
                                public void run() {
                                    Toast.makeText(UploadImage.this, "Response " + the_string_response, Toast.LENGTH_LONG).show();                          
                                }
                            });

                     }catch(Exception e){
                          runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                Toast.makeText(UploadImage.this, "ERROR " + e.getMessage(), Toast.LENGTH_LONG).show();                              
                            }
                        });
                           System.out.println("Error in http connection "+e.toString());
                     }  
            }
        });
         t.start();
        }

        public String convertResponseToString(HttpResponse response) throws IllegalStateException, IOException{

             String res = "";
             StringBuffer buffer = new StringBuffer();
             inputStream = response.getEntity().getContent();
             int contentLength = (int) response.getEntity().getContentLength(); //getting content length…..
              runOnUiThread(new Runnable() {

            @Override
            public void run() {
                Toast.makeText(UploadImage.this, "contentLength : " + contentLength, Toast.LENGTH_LONG).show();                     
            }
        });

             if (contentLength < 0){
             }
             else{
                    byte[] data = new byte[512];
                    int len = 0;
                    try
                    {
                        while (-1 != (len = inputStream.read(data)) )
                        {
                            buffer.append(new String(data, 0, len)); //converting to string and appending  to stringbuffer…..
                        }
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                    try
                    {
                        inputStream.close(); // closing the stream…..
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                    res = buffer.toString();     // converting stringbuffer to string…..

                    runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                       Toast.makeText(UploadImage.this, "Result : " + res, Toast.LENGTH_LONG).show();
                    }
                });
                    //System.out.println("Response => " +  EntityUtils.toString(response.getEntity()));
             }
             return res;
        }
}

PHP 代码

<?php
    $base=$_REQUEST['image'];
     $binary=base64_decode($base);
    header('Content-Type: bitmap; charset=utf-8');
    $file = fopen('uploaded_image.jpg', 'wb');
    fwrite($file, $binary);
    fclose($file);
    echo 'Image upload complete!!, Please check your php file directory……';
?>

更新

NameValuePair 和 Http 类已被弃用,所以我已经尝试过这段代码,它对我有用.希望有帮助!

NameValuePair and Http Classes are deprecated so, I've tried this code and it's working for me. Hope that helps!

private void uploadImage(Bitmap imageBitmap){
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    imageBitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
    byte[] b = stream.toByteArray();
    String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
    ArrayList<Pair<String, String>> params = new ArrayList<Pair<String, String>>();
    params.add(new Pair<>("image", encodedImage));

    try {
        new AsyncUploader().execute(my_upload_php, getQuery(params));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}

private String getQuery(List<Pair<String, String>> params) throws UnsupportedEncodingException{
    StringBuilder result = new StringBuilder();
    boolean first = true;

    for(Pair<String, String> pair : params){
        if(first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(pair.first, "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(pair.second, "UTF-8"));
    }
    return result.toString();
}

private class AsyncUploader extends AsyncTask<String, Integer, String>
{
    @Override
    protected String doInBackground(String... strings) {
        String urlString = strings[0];
        String params = strings[1];
        URL url = null;
        InputStream stream = null;
        HttpURLConnection urlConnection = null;
        try {
            url = new URL(urlString);
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("POST");
            urlConnection.setDoOutput(true);

            urlConnection.connect();

            OutputStreamWriter wr = new OutputStreamWriter(urlConnection.getOutputStream());
            wr.write(params);
            wr.flush();

            stream = urlConnection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"), 8);
            String result = reader.readLine();
            return result;
        }catch (IOException ioe){
            ioe.printStackTrace();
        } finally {
            if (urlConnection != null)
                urlConnection.disconnect();
        }
        return null;
    }

    @Override
    protected  void onPostExecute(String result) {
        Toast.makeText(MakePhoto.this, result, Toast.LENGTH_SHORT).show();
    }
}

这篇关于将图像从android上传到PHP服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

DeepL的翻译效果还是很强大的,如果我们要用php实现DeepL翻译调用,该怎么办呢?以下是代码示例,希望能够帮到需要的朋友。 在这里需要注意,这个DeepL的账户和api申请比较难,不支持中国大陆申请,需要拥有香港或者海外信用卡才行,没账号的话,目前某宝可以
PHP通过phpspreadsheet导入Excel日期,导入系统后,全部变为了4开头的几位数字,这是为什么呢?原因很简单,将Excel的时间设置问文本,我们就能看到该日期本来的数值,上图对应的数值为: 要怎么解决呢?进行数据转换就行,这里可以封装方法,或者用第三方的
mediatemple - can#39;t send email using codeigniter(mediatemple - 无法使用 codeigniter 发送电子邮件)
Laravel Gmail Configuration Error(Laravel Gmail 配置错误)
Problem with using PHPMailer for SMTP(将 PHPMailer 用于 SMTP 的问题)
Issue on how to setup SMTP using PHPMailer in GoDaddy server(关于如何在 GoDaddy 服务器中使用 PHPMailer 设置 SMTP 的问题)