Android - отправить файл изображения в базу данных сервера

Пользователи сохраняют три данных: имя, заметку и изображение. Как вы можете видеть в приведенном ниже коде, мне удалось написать код для отправки имени и примечания на сервер. Но я понятия не имею, как отправить выбранный файл изображения с устройства на serverDB.

public class AddEditWishlists extends Activity {

    // Client-Server - Start //////////////////////
    // Progress Dialog
    private ProgressDialog pDialog;

    JSONParser jsonParser = new JSONParser();
    EditText inputName;
    EditText inputDesc;

    // url to create new product
    private static String url_create_product = 
        "http://10.56.43.91/android_connect/create_product.php";


    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    // Client-Server - End //////////////////////


    //Define Variables
    private EditText inputname;
    private EditText inputnote;
    private Button upload;
    private Bitmap yourSelectedImage;
    private ImageView inputphoto;
    private Button save;
    private int id;
    private byte[] blob=null;
    byte[] image=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_wishlist);
        setUpViews();
    }

    private void setUpViews() {

        inputname = (EditText) findViewById(R.id.inputname);
        inputnote = (EditText) findViewById(R.id.inputnote);
        inputphoto = (ImageView) findViewById(R.id.inputphoto); 

        Bundle extras = getIntent().getExtras();

        if (extras != null) {
            id=extras.getInt("id");
            inputname.setText(extras.getString("name"));
            inputnote.setText(extras.getString("note"));

            image = extras.getByteArray("blob");

            if (image != null) {
                if (image.length > 3) {
                    inputphoto.setImageBitmap(BitmapFactory.decodeByteArray(image,0,image.length));
                }
            }

        }



        //Image Upload Button
        upload = (Button) findViewById(R.id.upload);
        upload.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("image/*");
                startActivityForResult(intent, 0);
            }
        });

        // Save the data
        save = (Button) findViewById(R.id.save);

        // Save하면 발생되는 이벤트
        save.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                if (inputname.getText().length() != 0) {
                    AsyncTask<Object, Object, Object> saveContactTask = new AsyncTask<Object, Object, Object>() {
                        @Override
                        protected Object doInBackground(Object... params) {
                            saveContact();

                            // Client-Server - Start //////////////////////////////////////
                            String name = inputname.getText().toString();
                            String description = inputnote.getText().toString();


                            // Building Parameters
                            List<NameValuePair> params1 = new ArrayList<NameValuePair>();
                            params1.add(new BasicNameValuePair("name", name));
                            params1.add(new BasicNameValuePair("description", description));

                            // getting JSON Object
                            // Note that create product url accepts POST method
                            JSONObject json = jsonParser.makeHttpRequest(url_create_product, "POST", params1);

                            // check log cat fro response
                            Log.d("Create Response", json.toString());

                            // check for success tag
                            try {
                                int success = json.getInt(TAG_SUCCESS);

                                if (success == 1) {
                                    // successfully created product
                                    // closing this screen
                                    finish();
                                } else {
                                    // failed to create product
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }

                            // Client-Server - End ////////////////////////////////////

                            return null;
                        }

                        @Override
                        protected void onPostExecute(Object result) {
                            finish();
                        }
                    };

                    saveContactTask.execute((Object[]) null);

                } else {
                    AlertDialog.Builder alert = new AlertDialog.Builder(
                            AddEditWishlists.this);
                    alert.setTitle("Error In Save Wish List");
                    alert.setMessage("You need to Enter Name of the Product");
                    alert.setPositiveButton("OK", null);
                    alert.show();
                }
            }
        });
    }


    // If users save data, this will act (data -> db) 
    private void saveContact() {

        if(yourSelectedImage!=null){
            ByteArrayOutputStream outStr = new ByteArrayOutputStream();
            yourSelectedImage.compress(CompressFormat.JPEG, 100, outStr);
            blob = outStr.toByteArray();
        }

        else{blob=image;}

        // Change Text type to string type to save in the DB
        SQLiteConnector sqlCon = new SQLiteConnector(this);

        if (getIntent().getExtras() == null) {
            sqlCon.insertWishlist(inputname.getText().toString(), inputnote.getText().toString(), blob);
        }

        else {
            sqlCon.updateWishlist(id, inputname.getText().toString(), inputnote.getText().toString(),blob);
        }


    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode,Intent resultdata) {
        super.onActivityResult(requestCode, resultCode, resultdata);
        switch (requestCode) {
        case 0:
            if (resultCode == RESULT_OK) {
                Uri selectedImage = resultdata.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 filePath = cursor.getString(columnIndex);

                cursor.close();
                // Convert file path into bitmap image using below line.
                yourSelectedImage = BitmapFactory.decodeFile(filePath);
                inputphoto.setImageBitmap(yourSelectedImage);
            }

        }
    }

}

Как я могу закодировать между аннотацией клиент-сервер для отправки файла изображения?..


person jung hur    schedule 08.05.2013    source источник
comment
Используйте http-запрос. См. github.com/kevinsawicki/.   -  person dannyroa    schedule 08.05.2013
comment
да, я уже использовал HTTP-запрос для отправки имени и заметки в серверную БД   -  person jung hur    schedule 08.05.2013
comment
мой вопрос в том, как отправить файлы изображений на сервер с помощью http-запроса   -  person jung hur    schedule 08.05.2013
comment
Я не вижу в вашем коде, что вы используете библиотеку http-request. Ссылка является примером того, как отправить файл на сервер.   -  person dannyroa    schedule 08.05.2013
comment
проверьте эту строку JSONObject json = jsonParser.makeHttpRequest(url_create_product, POST, params1);   -  person jung hur    schedule 14.05.2013
comment
Я сделал класс JSONParser отдельно.   -  person jung hur    schedule 14.05.2013


Ответы (2)


Вы можете преобразовать выбранное изображение в строку base 64, а затем передать эту строку на сервер, а затем на сервере декодировать это,

Проверьте этот код, чтобы преобразовать изображение в base64. Если у вас есть imageView, вы можете написать этот код,

imageView.buildDrawingCache();
Bitmap bm = imageView.getDrawingCache();
ByteArrayOutputStream baos = new ByteArrayOutputStream();  
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object   
byte[] b = baos.toByteArray();

String encodedImage = Base64.encodeToString(b , Base64.DEFAULT);

РЕДАКТИРОВАТЬ

как и в вашем коде, у вас есть массив байтов в этой строке,

image = extras.getByteArray("blob");

так что вы можете сразу написать эту строку кода после этого,

String encodedImage = Base64.encodeToString(image , Base64.DEFAULT);
person Ice Box    schedule 08.05.2013
comment
@junghur проверьте мой отредактированный ответ, если у вас есть изображение, вы можете получить строку base64, как указано выше. Вы можете написать этот код после того, как получите выбранное изображение в изображении. - person Ice Box; 08.05.2013
comment
что мне делать, если у меня нет изображения - person jung hur; 08.05.2013
comment
Вам не нужно представление изображения, в вашем коде у вас есть массив байтов, поэтому просто используйте класс Base64, чтобы получить строку base64, см. мой отредактированный ответ. - person Ice Box; 09.05.2013
comment
На самом деле вам не нужен первый код, который можно было бы использовать, если бы у вас было изображение, возьмите второй. - person Ice Box; 10.05.2013
comment
второй означает String encodedImage = Base64.encodeToString(image, Base64.DEFAULT); Вот этот? - person jung hur; 13.05.2013
comment
Когда я добавил String encodedImage = Base64.encodeToString(image, Base64.DEFAULT); эта строка, DEFAUL выдает ошибку. Зачем? - person jung hur; 13.05.2013
comment
удалось получить фото в БД сервера!! но это выглядит так - person jung hur; 13.05.2013
comment
com.example.philips.AddEditWishlists@41bcf568 как сохранить файл в формате jpg на моем ноутбуке (сервере)? - person jung hur; 13.05.2013
comment
Ошибка может быть связана с тем, что минимальный уровень SDK, необходимый для этого, равен 8, поэтому измените его на 8 в манифесте. Кроме того, закодированная строка не должна выглядеть как com.example.philips.AddEditWishlists@41bcf568, она должна выглядеть примерно так: 46c6pbLHIlsos2JdLYhlZ5cbH3E8SD5gfbkg5mXxHdR2/wDwipZPOEf9j7PJy. ........и многое другое. Проверьте свой код. Как только вы преобразуете это изображение в строку, проверьте, напечатав эту строку. Также на стороне сервера вы можете найти в Google, как преобразовать строку base64 в массив байтов, а затем обратно в изображение на вашем языке на стороне сервера, вы будете получить много потоков. - person Ice Box; 14.05.2013
comment
спасибо за ваш добрый ответ! Кстати, на стороне сервера БД имя отправляется в виде varchar, описание отправляется в виде текста. Что насчет фото? должен ли он быть в бинарной форме? или что..? - person jung hur; 14.05.2013
comment
И действительно, на стороне сервера мне удалось сохранить фото, но это пустой файл... - person jung hur; 14.05.2013
comment
ты знаешь в чем проблема..бро..? - person jung hur; 14.05.2013
comment
Вы можете проверить эту ссылку, пожалуйста? stackoverflow .com/questions/16540238/ - person jung hur; 14.05.2013
comment
убедитесь, что вы отправляете ту же закодированную строку, потому что в методе onclick кнопки сохранения вы переопределяете значение закодированной строки - person Ice Box; 14.05.2013
comment
Я получил такой строковый формат: - person jung hur; 14.05.2013
comment
но в моем каталоге до сих пор сохраняется пустой файл! любое предложение, пожалуйста? - person jung hur; 14.05.2013
comment
да, теперь вы получаете правильную строку, должно быть что-то не так при преобразовании этой строки обратно в изображение. Как вы это делаете. Найдите, как преобразовать строку base64 в массив байтов, а затем обратно в изображение в php. - person Ice Box; 14.05.2013
comment
ты знаешь пхп? не могли бы вы проверить эту ссылку? stackoverflow.com/questions/16543753/ - person jung hur; 14.05.2013
comment
ты моя последняя надежда... я работаю над этим уже 2 недели... :(..хочу плакать.... - person jung hur; 14.05.2013
comment
мне нужно преобразовать строку base64 в массив байтов на стороне сервера (php) или на стороне клиента (android)? - person jung hur; 14.05.2013
comment
Эй, не волнуйся. Прочитайте этот поток stackoverflow stackoverflow.com/questions/ 9920967/ тот же сценарий, что и у вас. Я уверен, что вы получите ответ здесь. - person Ice Box; 14.05.2013
comment
братан!!!! Я получил файл в свой каталог!!! но единственная проблема в том, что я получил только файл .. не с jpg. Итак, мне нужно переименовать его как имя файла -> имя файла.jpg - person jung hur; 14.05.2013
comment
любое предложение для автоматического получения файла jpg, чтобы мне не нужно было его переименовывать ??? - person jung hur; 14.05.2013
comment
чувак, наконец-то я это сделал!!! человек ... после более чем 2 недель ... я сделал это ... так что спасибо и спасибо за вашу помощь !! - person jung hur; 14.05.2013
comment
Хотя этот ответ работает, он не совсем оптимален для производственной среды, где вы не можете контролировать тип и размер изображений, которые пользователи хотят загружать; Причина в том, что если пользователь выбирает очень большое изображение с точки зрения размера, вы легко получите «OutOfMemoryException» с этим решением. Узнайте больше о многостраничных загрузках; они обеспечивают идеальное решение. - person Edward Quixote; 16.03.2020

Я использую следующий код для загрузки изображения на php-сервер. Обратите внимание на функцию uploadFile, вам просто нужно передать путь к изображению с SD-карты.

public class PhotosActivity extends Activity {
    ImageView img, img1;
    int column_index;
    Intent intent = null;
    Bitmap bitmap = null;
    FileInputStream in1, in2, in3;
    BufferedInputStream buf;
    // Declare our Views, so we can access them later
    String logo, imagePath, Logo;
    Cursor cursor;

    private String Tag = "UPLOADER";
    private String urlString = "YOUR_ONLINE_PHP";
    HttpURLConnection conn;
    // YOU CAN EDIT THIS TO WHATEVER YOU WANT
    private static final int SELECT_PICTURE = 1;

    String selectedImagePath;
    // ADDED
    String filemanagerstring;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.photos1_layout);
        // ListView iv= (ListView)findViewById(R.id.listView1);
        // iv.setAdapter(new ArrayAdapter(this,
        // android.R.layout.simple_list_item_1, values));
        // iv.setAdapter(new
        // ArrayAdapter(this,android.R.layout.simple_list_item_1, values));
        img = (ImageView) findViewById(R.id.imageView1);

    }

    public void onClick(View v) {
        // select a file
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"),
                SELECT_PICTURE);

    }

    String path = "";


    // UPDATED
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
                Uri selectedImageUri = data.getData();

                // OI FILE Manager
                filemanagerstring = selectedImageUri.getPath();

                // MEDIA GALLERY
                selectedImagePath = getPath(selectedImageUri);

                img.setImageURI(selectedImageUri);

                imagePath.getBytes();
                path = imagePath.toString();
                // TextView txt = (TextView)findViewById(R.id.title);
                // txt.setText(imagePath.toString());

                Bitmap bm = BitmapFactory.decodeFile(imagePath);

                uploadFile(imagePath.toString());

            }

        }

    }

    public int uploadFile(String sourceFileUri) {
        String upLoadServerUri = "http://"+common.ipaddress+"/database/upload.php";
        String fileName = sourceFileUri;
        int serverResponseCode = 0;
        HttpURLConnection conn = null;
        DataOutputStream dos = null;
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1 * 1024 * 1024;
        File sourceFile = new File(sourceFileUri);
        if (!sourceFile.isFile()) {
            Log.e("uploadFile", "Source File Does not exist");
            return 0;
        }
        try { // open a URL connection to the Servlet
            FileInputStream fileInputStream = new FileInputStream(sourceFile);
            URL url = new URL(upLoadServerUri);
            conn = (HttpURLConnection) url.openConnection(); // Open a HTTP
                                                                // connection to
                                                                // the URL
            conn.setDoInput(true); // Allow Inputs
            conn.setDoOutput(true); // Allow Outputs
            conn.setUseCaches(false); // Don't use a Cached Copy
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("ENCTYPE", "multipart/form-data");
            conn.setRequestProperty("Content-Type",
                    "multipart/form-data;boundary=" + boundary);
            conn.setRequestProperty("uploaded_file", fileName);
            dos = new DataOutputStream(conn.getOutputStream());

            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""
                    + fileName + "\"" + lineEnd);
            dos.writeBytes(lineEnd);

            bytesAvailable = fileInputStream.available(); // create a buffer of
                                                            // maximum size

            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];

            // read file and write it into form...
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);

            while (bytesRead > 0) {
                dos.write(buffer, 0, bufferSize);
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            }

            // send multipart form data necesssary after file data...
            dos.writeBytes(lineEnd);
            dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

            // Responses from the server (code and message)
            serverResponseCode = conn.getResponseCode();
            String serverResponseMessage = conn.getResponseMessage();

            Log.i("uploadFile", "HTTP Response is : " + serverResponseMessage
                    + ": " + serverResponseCode);
            if (serverResponseCode == 200) {
                runOnUiThread(new Runnable() {
                    public void run() {
                        // tv.setText("File Upload Completed.");
                        Toast.makeText(PhotosActivity.this,
                                "File Upload Complete.", Toast.LENGTH_SHORT)
                                .show();
                    }
                });
            }

            // close the streams //
            fileInputStream.close();
            dos.flush();
            dos.close();

        } catch (MalformedURLException ex) {
            Toast.makeText(PhotosActivity.this, "MalformedURLException",
                    Toast.LENGTH_SHORT).show();
            Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(PhotosActivity.this,
                    "Exception : " + e.getMessage(), Toast.LENGTH_SHORT).show();
            Log.e("Upload file to server Exception",
                    "Exception : " + e.getMessage(), e);
        }
        return serverResponseCode;
    }

    // UPDATED!
    public String getPath(Uri uri) {
        String[] projection = { MediaColumns.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
        cursor.moveToFirst();
        imagePath = cursor.getString(column_index);

        return cursor.getString(column_index);
    }
}

и в пхп

$target_path1 = "upload/";

$target_path1 = $target_path1 . basename( $_FILES['uploaded_file']['name']);
move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $target_path1)

надеюсь, это поможет

person Tony Chhabada    schedule 08.05.2013
comment
почему он слишком длинный, и этот код не соответствует моему коду, я думаю... нет..? - person jung hur; 09.05.2013
comment
Я получаю нулевое исключение прямо в dos = new DataOutputStream(conn.getOutputStream()); - person Theodoros80; 07.09.2013
comment
@ Theodoros80 Вы не забыли установить conn.setRequestMethod("POST") и conn.setDoOutput(true)? Если это так, может быть, ваш объект conn имеет значение null? В вашей трассировке стека должно быть больше подсказок. - person ban-geoengineering; 15.09.2015