1

jsonを介してphpファイルに画像エンコードされたデータを取得しています。私の要件は、各画像に一意の名前を割り当てる必要がある場合、その画像をサーバーの 1 つのフォルダーに保存することです。画像を一意の名前のフォルダーに保存する方法について多くの疑問が生じており、画像のパスがデータベースに保存されています。私はいくつかの StackOverflow の質問とオンライン ソースを見てきましたが、それらを明確に理解できませんでした。この質問は、PHP を扱っている人にとっては簡単に思えます。しかし、PHP の初心者として、また Android 開発者として、私はあまり詳細でない回答を理解することができません。ですから、誰かがコードスニペットと説明を手伝ってくれたら本当にありがたいです. 質問とコードの説明をコメント付きでできる限り明確に保つようにしました。間違いがあれば、お手柔らかにお願いします。以下は、私が試してみて、いくつかの点で動かなくなったコードです。前もって感謝します..

    <?php
    $response = array();

    // check for required fields
    if (isset($_POST['mailid']) && isset($_POST['category']) && isset($_POST['description']) && isset($_POST['contactNum']) && isset($_POST['lookingto']) && isset($_POST['image'])) {

        $usermail = $_POST['mailid'];
        $category = $_POST['category'];
        $description = $_POST['description'];
        $contactNum = $_POST['contactNum'];
        $lookingto = $_POST['lookingto'];
        $base=$_POST['image'];

        $binary=base64_decode($base);

        $folder = "images/"; // This is my folder "images" in which pics have to be stored.

        $file = fopen('storepic.jpg', 'wb');  // Here I have to give name dynamically to each pic provided that should be unique. Here I mentioned pic name as storepic.jpg, a static name.

        fwrite($file, $binary);

        fclose($file);

        // include db connect class
        require_once __DIR__ . '/db_connect.php';

        // connecting to db
        $db = new DB_CONNECT();

        // mysql inserting a new row
        $result = mysql_query("INSERT INTO details(usermail, category, description, contactnumber,posting_for) VALUES('$usermail', '$category', '$description','$contactNum','$lookingto')");

//// Even after giving dynamic name how can we store the path of the dynamic named image into database in the above query. For that what should be done here..

        // check if row inserted or not
        if ($result) {
            // successfully inserted into database
            $response["success"] = 1;

            // echoing JSON response
            echo json_encode($response);
        } else {
            // failed to insert row
            $response["success"] = 0;


            // echoing JSON response
            echo json_encode($response);
        }
    } else {

        $response["success"] = 0;


        // echoing JSON response
        echo json_encode($response);
    }
    ?>

他のphpファイルでも、selectクエリでデータを取得しています。挿入した通常のデータを Android クライアント側アプリで取得できます。しかし、後でbase64でエンコードされたデータに変換し、json応答としてエコーするためにパスから画像を取得する方法..

注:-私の UI はフォームではありません。Android UI です。

4

2 に答える 2

2
    // A very basic field validation. You should really use mysqli* or PDO*.

    $fields = array(
        'usermail'    => 'mailid',
        'category'    => 'category',
        'description' => 'description',
        'contactNum'  => 'contactNum',
        'lookingto'   => 'lookingto',
        'binary'      => 'base',
    );
    $okay = true;
    foreach($fields as $var => $field)
    {
         if (!isset($_POST[$field]))
             $okay = false;
         if ('binary' == $var)
             ${$var} = base64_decode($_POST[$field]);
         else
             ${$var} = mysql_real_escape_string($_POST[$field]);
    }
    if (!$okay)
    {    
        $response["success"] = 0;
        Header("Content-Type: application/json;charset=UTF-8");
        die(json_encode($response));
    }

    $folder = "images/"; // This is my folder "images" in which pics have to be stored.

    $file   = tempnam($folder, 'image');

    $fp     = fopen($file, 'w');
    fwrite($file, $binary);    
    fclose($file);

    /* BUT WHAT IF THE FILE IS NOT JPEG?
       Then you use GD library and do:

       $gd = ImageCreateFromString($binary);
       if (!$gd)
       {
           // Abort. Image was invalid.
       }
       // Here you can even resize it.
       ImageJPEG($gd, $file, 75); // Quality 75%; useable values from 40 to 100
       ImageDestroy($gd);
    */

    ...

    $result = mysql_query("INSERT INTO details(usermail, category, description, contactnumber,posting_for) VALUES('$usermail', '$category', '$description','$contactNum','$lookingto')");

    // I assume that the above table has an unique ID. So we retrieve it
    $lastid = mysql_insert_id(); 

    rename($file, $newfile = sprintf("%s/img%08d.jpg", $folder, $lastid));

上記では、名前が行 ID と同じであるため、ファイル名の列名は必要ありませんimages/img00001234.jpg。ID が 1234 の場合、画像は.

それ以外の場合は、別のクエリを発行する必要があります。

    UPDATE details SET filename='$newfile' WHERE id = $lastid;

取得するには

いずれの場合も、取得する行に関する情報を受け取ります。少なくともその ID、または何らかの条件でWHERE. たとえば、ユーザーの電子メールを取得した場合 (そしてそれが一意のキーである場合)、 を使用しますWHERE email='...'

したがってSELECT * FROM details WHERE...、これらの詳細の中からIDまたはfilenameフィールドを見つけることができます。

最初のケースでは、ファイル名を作成するのに十分であり、データベース クエリも必要ありませんが、ID を知っている人なら誰でも imageにアクセスできることを覚えておいてください。そうでない場合もあります。

$lastid  = (int)$_REQUEST['id'];
$newfile = sprintf("%s/img%08d.jpg", $folder, $lastid);

構文は上記と同じであることに注意してください。キャストは、(int)これがユーザー提供の情報であり、あらゆる種類の悪意のある情報が含まれている可能性があることを覚えておく必要があります。

2 番目のケースでは、a を発行してWHERE、取得したタプルから ID または直接ファイル名フィールドをフェッチします。

画像パスがあれば、それをユーザーに送信できます...画像がそこにある場合。チェックしてるだけ。

if (!is_readable($newfile))
{
    Header('HTTP/1.0 404 Not Found')
    readfile('/path/to/beautiful/error-page.html');
    die();
}
// if you are really paranoid, or want to support different quality images,
// you can $gd = imageCreateFromJPEG($newfile); here, check it succeeded or
// send 404 / 500 error if it failed, manipulate $gd and send it along with
// ImageJPEG($gd, '', $quality); instead of the readfile() down there. With
// this approach, you'll better not send Content-Length, though. This makes
// image DOWNLOADS more awkward (you don't see "104K of 1.3M downloaded").

Header('Content-Type: image/jpeg');
Header('Content-Length: ' . filesize($newfile));
readfile($newfile);
die();

...以上です。上記を呼び出す HTML ソースでは、次のようになります。

<img class="avatar" src="images.php?id=<?php echo $details['id']; ?>" />

(もちろん、その HTML を生成する PHPはデータベースにアクセスして fetch する必要$detailsがあります)。

「呼び出し側」の PHP がデータベースのタプル情報を保護された方法で _GET パラメータに保存できるようにする設定は他にもあります。

image.php?id=1234

Bob の ID が 7654 であることはわかっていますが、1234 を 7654 に変更しても画像を取得することはできませんが、これが誰かに興味があるかどうかはわかりません。

Web ブラウザでは、コンテンツを設定するだけで十分です。Internet Explorer を使用すると、ファイルの末尾が.jpg.

于 2012-11-15T17:31:32.230 に答える
0
    package com.example.test_image_save;

    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.IOException;

    import android.app.Activity;
    import android.content.ContentValues;
    import android.content.Context;
    import android.content.Intent;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.graphics.BitmapFactory;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;

    public class MainActivity extends Activity implements OnClickListener {
    protected static TextView textView;
    protected static ImageView image1, image2;
    protected Button get_image, save_image, read_image;
    private String selectedImagePath;
    private static final int SELECT_PICTURE = 1;
    String DB_NAME = Environment.getExternalStorageDirectory() + "/test.db";
    String TABLE_NAME = "mytable";

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    image1 = (ImageView) findViewById(R.id.imageView1);
    image2 = (ImageView) findViewById(R.id.imageView2);
    textView = (TextView) findViewById(R.id.textView1);

    get_image = (Button) findViewById(R.id.get_image);
    get_image.setOnClickListener(this);

    save_image = (Button) findViewById(R.id.save_image);
    save_image.setOnClickListener(this);

    read_image = (Button) findViewById(R.id.read_image);
    read_image.setOnClickListener(this);

    }

    public void onClick(View v) {

    int id = v.getId();
    switch (id) {

    case R.id.get_image:
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(
                Intent.createChooser(intent, "Select Picture"),
                SELECT_PICTURE);
        break;

    case R.id.save_image:
        createTable();
        saveInDB();
        break;

    case R.id.read_image:
        readFromDB();
        break;
    default:
        break;

    }
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);
            System.out.println("Image Path : " + selectedImagePath);
            image1.setVisibility(View.VISIBLE);
            image1.setImageURI(selectedImageUri);
        }
    }
    }

    @SuppressWarnings("deprecation")
    public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
    }

    void createTable() {
    SQLiteDatabase myDb = openOrCreateDatabase(DB_NAME,
            Context.MODE_PRIVATE, null);
    String MySQL = "create table if not exists "
            + TABLE_NAME
            + " (_id INTEGER primary key autoincrement, name TEXT not null, image BLOB);";
    myDb.execSQL(MySQL);
    myDb.close();
    }

    void saveInDB() {
    SQLiteDatabase myDb = openOrCreateDatabase(DB_NAME,
            Context.MODE_PRIVATE, null);
    byte[] byteImage1 = null;
    String s = myDb.getPath();

    myDb.execSQL("delete from " + TABLE_NAME);          // clearing the table
    ContentValues newValues = new ContentValues();
    String name = "SachinImages";
    newValues.put("name", name);
    try {
        FileInputStream instream = new FileInputStream(selectedImagePath);
        BufferedInputStream bif = new BufferedInputStream(instream);
        byteImage1 = new byte[bif.available()];
        bif.read(byteImage1);
        newValues.put("image", byteImage1);
        long ret = myDb.insert(TABLE_NAME, null, newValues);
        if (ret < 0)
            textView.append("Error");
    } catch (IOException e) {
        textView.append("Error Exception : " + e.getMessage());
    }
    myDb.close();
    textView.append("\n Saving Details \n Name : " + name);
    textView.append("\n Image Size : " + byteImage1.length + " KB");
    textView.append("\n Saved in DB : " + s + "\n");
    Toast.makeText(this.getBaseContext(),
            "Image Saved in DB successfully.", Toast.LENGTH_SHORT).show();
    }

    void readFromDB() {
    byte[] byteImage2 = null;
    SQLiteDatabase myDb;
    myDb = openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
    Cursor cur = myDb.query(TABLE_NAME, null, null, null, null, null, null);
    cur.moveToFirst();
    while (cur.isAfterLast() == false) {
        textView.append("\n Reading Details \n Name : " + cur.getString(1));
        cur.moveToNext();
    }

    // /////Read data from blob field////////////////////
    cur.moveToFirst();
    byteImage2 = cur.getBlob(cur.getColumnIndex("image"));
    setImage(byteImage2);
    cur.close();
    myDb.close();
    Toast.makeText(this.getBaseContext(),
            "Image read from DB successfully.", Toast.LENGTH_SHORT).show();
    Toast.makeText(this.getBaseContext(),
            "If your image is big, please scrolldown to see the result.",
            Toast.LENGTH_SHORT).show();
    }

    void setImage(byte[] byteImage2) {
    image2.setImageBitmap(BitmapFactory.decodeByteArray(byteImage2, 0,
            byteImage2.length));
    textView.append("\n Image Size : " + byteImage2.length + " KB");
    }

    }
于 2015-04-27T05:11:42.503 に答える