我将图像存储在数据库中但被替换

时间:2016-08-14 20:37:24

标签: java android mysql

我在这里使用volley运行简单的代码,代码只是将从手机中取出的图片上传到我的网络服务器中的数据库。

这是我的主要活动.java:

public class MainActivity extends AppCompatActivity {

    private Button button;
    private String encoded_string, image_name;
    private Bitmap bitmap;
    private File file;
    private Uri file_uri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.start);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                getFileUri();
                i.putExtra(MediaStore.EXTRA_OUTPUT, file_uri);
                startActivityForResult(i, 10);
            }
        });
    }

    private void getFileUri() {
        image_name = "testing123.jpg";

        file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
                + File.separator + image_name
        );

        file_uri = Uri.fromFile(file);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == 10 && resultCode == RESULT_OK) {
            new Encode_image().execute();
        }
    }

    private class Encode_image extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... voids) {

            bitmap = BitmapFactory.decodeFile(file_uri.getPath());
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 75, stream);
            bitmap.recycle();

            byte[] array = stream.toByteArray();
            encoded_string = Base64.encodeToString(array, 0);
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            makeRequest();
        }
    }

    private void makeRequest() {
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        StringRequest request = new StringRequest(Request.Method.POST, "http://mysite/connection.php",
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String,String> map = new HashMap<>();
                map.put("encoded_string",encoded_string);
                map.put("image_name",image_name);

                return map;
            }
        };
        requestQueue.add(request);
    }
}

好的,我现在有这个问题,当我上传一张照片时,我知道它会被上传到我的网络服务器中的图片文件夹,但它会上传名为testing123.jpg的图片,如果我采取的话它存储到数据库的另一张照片,但在我的图像文件夹中,它不会创建,而是用新图像替换我现有的testing123.jpg,我想要的是当我拍照时它存储了图片,但名称不同,或者名称手机本身为照片提供,我知道错误发生在这里

 private void getFileUri() {
            image_name = "testing123.jpg";

            file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
                    + File.separator + image_name
            );

            file_uri = Uri.fromFile(file);
        }

我的connection.php

<?php
 header('Content-type : bitmap; charset=utf-8');

 if(isset($_POST["encoded_string"])){

    $encoded_string = $_POST["encoded_string"];
    $image_name = $_POST["image_name"];

    $decoded_string = base64_decode($encoded_string);

    $path = 'images/'.$image_name;

    $file = fopen($path, 'wb');

    $is_written = fwrite($file, $decoded_string);
    fclose($file);

    if($is_written > 0) {

        $connection = mysqli_connect('mysql.host', 'user', 'pass','db');
        $query = "INSERT INTO photos(name,path) values('$image_name','$path');";

        $result = mysqli_query($connection, $query) ;

        if($result){
            echo "success";
        }else{
            echo "failed";
        }

        mysqli_close($connection);
    }
 }
?>

好的,那是第一个问题

关于我的另一个问题只是一个安全问题

让我说我用我的脚本connect.php上传我的照片,但我不希望任何人通过我的页面与我的脚本进行交互,让我说我只想让连接私密和安全,我该怎么办?制作一个REST API来处理像严肃的应用程序更安全的连接?

1 个答案:

答案 0 :(得分:0)

最大的问题是你不能根据用户给你的名字保存图像,这是一个巨大的安全问题,更不用说它可以让一个人踩踏你想要的所有图像。您需要为每次上传组成一个随机名称,或者根据您的INSERT生成的记录ID(例如LAST_INSERT_ID()),该记录ID应该是唯一的,只要您永远不会重置{{1} }序列。

值得注意的是,HTTP多部分上传是发送任意文件数据的标准方式。如果有人可以发送无限大小的有效载荷,你就会在这里暴露自己的DDOS攻击。