从Android中的服务器加载大量图像

时间:2017-06-23 04:38:19

标签: java php android json

编辑2:即使在赏金之后,也没有人可以提供完整的解决方案。所以我自己解决了。我在下面发布了我的解决方案。

我在Google上搜索了它,并发现了各种好的结果。但由于我不是服务器和后端类型的专家,我想在一个单独的问题中提出这个问题。我有一个网站托管,可以帮助我运营一个机构的网站。

  1. 在我的Android应用程序中,应该有一个选项,例如“照片库”,它显示我网站上的图像(我在文件夹中上传图像)。我认为可以通过管理一些JSON文件来完成。

  2. 设有一个文件夹\ public_html \ MyApp \ Images,其中包含“Event1”,“Event2”等文件夹。我将图像上传到这些不同的文件夹,我的Android应用程序应加载它们(可能单独让用户选择一个文件夹)。

  3. 有可能吗?如果需要任何高级数据库系统,请给我一些介绍链接。有没有什么方法可以自动生成包含图像链接的JSON?

    编辑:我最近购买了后端类型的网站托管,我没有做任何服务器端脚本或任何东西。这就是为什么需要详细的答案。我不知道如何管理这些图像,只需上传图像并将链接放在JSON中或使用一些MySQL,SQL或我从未使用过的任何术语。

11 个答案:

答案 0 :(得分:4)

从外观上看,您需要2个新的数据库表。一个用于存储相册,另一个用于存储单个图像。

CREATE TABLE `album` (
   `album_id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
   `album_name` VARCHAR(255) NOT NULL,
   `album_date` DATE NOT NULL);

album会存储所有相册元数据,因此会存储Event1及其详细信息,Event2等等。

CREATE TABLE `images` (
   `image_id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
   `album_id` INT(11) NOT NULL,
   `image_date` DATE NOT NULL,
   `image_path` VARCHAR(255) NOT NULL,
FOREIGN KEY (album_id) REFERENCES album(album_id));

images会使用album_id作为外键将所有图片及其路径和所属相册存储起来<​​/ p>

您对所有图片的查询将是

SELECT * FROM `images`;

来自特定相册的图像将被查询为

SELECT * FROM `images` WHERE `album_id` = *YOUR_ID*;

SQL查询的输出可以使用

进行JSON编码
json_encode($query_result); //PHP code

修改Gallery App Example On Android Hive

您似乎将图像作为BLOB直接保存到数据库中,因此它会为您提供64kb的限制。如果保存图像的路径会更好。 如果不可能,则base64对图像进行编码并将其存储在VARCHAR类型的列中。

答案 1 :(得分:2)

您可以通过JSON中的服务器获取所有图像的路径,并通过Picasso库的帮助传递路径来显示图像 -

Picasso.with(context).load("imagepath").placeholder(R.drawable.placeholder)

.error(R.drawable.placeholder_error).into(ImageView的);

答案 2 :(得分:2)

此解决方案不需要数据库。

PHP中需要两个API端点

上传images / api / upload

<?php

$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File is an image - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "File is not an image.";
        $uploadOk = 0;
    }
}
// Check if file already exists
if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}
// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}
// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
}
?>
  1. 列出图片
  2. 首先列出上传目录下的所有目录:

    $array = glob("uploads/*", GLOB_ONLYDIR);
    echo json_encode($array);
    
    1. 如果您需要特定文件夹,可以通过发送文件夹名称并附加到请求URL并列出所有文件来实现。

      $ array = glob(“uploads /".$_ REQUEST ['dir']。”/ *“); echo json_encode($ array);

    2. 修改

      // provides the current working directory
      echo getcwd() ."\r\n";
      // then navigate to path
      // glob(getcwd() . DIRECTORY_OF_IMAGES));
      // GLOB_BRACE tells to find all extensions in the brace
      $array = glob(getcwd() . "/web/bundles/img/*.{jpg,gif,png}", GLOB_BRACE);
      

      阅读这篇文章http://php.net/manual/en/function.glob.php

答案 3 :(得分:1)

对不起我的英文,您可以在创建文件夹时在数据库中添加文件夹名称并在应用程序中加载所有文件夹名称,并将图像名称保存在数据库中,文件夹名称表primery键作为外键,当用户选择文件夹名称时使用该文件夹命名primery键并使用该键获取所有图像并将其加载到app。

答案 4 :(得分:1)

抱歉英语不好......

此图像在数据库中保存为Blob类型,或者您保存某种类型的链接?

您可以使用文件夹名称发送某种HTTP请求,然后使用图像数据构建一个json。我在我的应用程序中使用Volley lib来处理HTTP请求,非常简单并且运行良好

答案 5 :(得分:1)

是的,你可以真正做到这一点,它既可行又实用,因为你有一台服务器。要做的第一件事就是用这个api创建一个 API 你可以创建android可以从对象中获取JSON数据的URL,这意味着你还必须将图像路径转换为JSON。这个伟大的教程解释了有关该过程的所有内容,甚至更由于您正在加载大量数字,我建议您使用Picasso进行图像缓存以及回收站视图

https://www.simplifiedcoding.net/android-programming-tutorial-to-get-all-images-from-server/

快乐的编码!

答案 6 :(得分:1)

blob类型可以不同。一方面,他可以指sql blob type。 最重要的是MIME类型like here

如果您使用Java编写API / Backend,它可以像这样将图像流式传输到请求blob的客户端:

public javax.ws.rs.core.Response exportBlob( String blobName ) throws Exception
{
  Blob imageBlob = resultSet.getBlob(yourBlobColumnIndex); //query the blob from the Database
  String type = "image/png"; // Set your needed MIME Type
  StreamingOutput data = createStreamingOutput( imageBlob ); // stream it as a binary
  return Response.ok( data, type ).build();
}
  /**
   * Creates an Outputstream of the Data from the given Blob.
   *
   * @param blob the blob that needs to be converted.
   * @return Outputstream of the Blob Data.
   * @throws WebApplicationException when the conversion failed.
   */
  private static StreamingOutput createStreamingOutput( final java.sql.Blob blob )
  {
    return output -> {
      try ( InputStream stream = blob.getBinaryStream() )
      {
            byte[] buff = new byte[4096];
            int count;
            while ( ( count = stream.read( buff ) ) != -1 )
            {
               if ( count > 0 )
              {
                output.write( buff, 0, count );
              }
           }
      }
      catch ( SQLException e )
      {
        throw new WebApplicationException( e.getMessage(), e );
      }
    };
  }

将其转换为Base64也是一种选择。你必须适应你在android中可以使用的东西,将这个二进制数据再次转换回图像。

android的一个例子可能是:

//byteArray is what you recieved from the API in this example
Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0 ,byteArray.length);

修改

既然你说你在这种情况下知之甚少,那就让我添加一些资源。

  1. 如何在MySQL数据库here中保存实际图像(除了语法之外,这与其他数据库没有什么不同)
  2. 在php here
  3. 处理BLOB的一个令人困惑的例子
  4. 处理Java here
  5. 中的BLOB的示例

    经常讨论使用BLOB来保存图像。只需在数据库中添加图像的base64表示,就可以让生活变得非常简单。这样您就不需要处理dataType BLOB。但是我个人并不喜欢这个解决方案而更喜欢使用BLOB。 (我已经添加了一篇关于blob的文章,所以我不会再这样做了)

    此外,还有一些用于进入后端开发的链接,但这是您自己的努力到位的部分。这需要学习很多,但不要害怕。完成基础后,它将变得更加简单。

    Java Frameworks

    Interesting PHP Frameworks

    PHP Backend Tutorial

    Online course

    祝你好运!

答案 7 :(得分:1)

您尝试对base64中的所有图像进行编码,然后插入数据库,然后创建api,从数据库中获取所有图像,然后将您的Android应用程序与此api同步,并将图像作为sqlite存储在本地数据库中。 1.主要利润是现在你可以加载你的画廊imges离线

答案 8 :(得分:1)

请参阅,如果您在hostinger上拥有您的托管帐户,您可以选择创建自己的数据库,甚至不需要编写一行mysql代码。 对于服务器端,您需要学习Php。 此外,永远不建议将图像存储在数据库中。 将它们存储在主机站点上的存储目录中,以及它们在数据库中的链接(URL)。这样可以更快地获取图像。

对于Android方面,只需使用Picasso库,它可以节省您从服务器加载图像的时间和空间。

你们都准备好了。 :) 对查询的评论。

答案 9 :(得分:0)

我建议您考虑这两个文件的提供和存储选项:

  1. Overview of Blobstore API for Java
  2. Google Cloud Storage

答案 10 :(得分:0)

我自己找到了解决方案。它非常易于理解和实现,只需要了解JSON。首先,请从我的网站目录中查看此图片:

&#34; event1&#34;,&#34; event2&#34;文件夹是专辑名称。我们可以创造所需的数量。

&#34; getfolders 文件非常重要。含量:

{
   "test":[
      {
         "sub":"event1",
         "content":"https://i1.wp.com/www.downloadinformer.com/wp-content/uploads/2017/03/AMPFB.jpg?w=1366",
         "param":"1.php"
      },
      {
         "sub":"event2",
         "content":"myimageurl",
         "param":"myphpfilenamewithextension"
      }
   ]
}

我们在此处存储相册名称,您可以在&#34; sub&#34;领域。 &#34;内容&#34;字段包含指向专辑缩略图的链接和&#34; param&#34;包含相应PHP文件的名称。别担心,你不需要学习PHP。它是一个现成的脚本。

1.PHP

<?php

$indir = array_filter(scandir('event1'), function($item) {
        return $item[0] !== '.';
});

echo json_encode($indir);
?>

这个PHP文件的作用是什么?它列出了指定文件夹中存在的所有文件名。正如您所看到的,我们已经指定了&#34; event1 &#34;作为此PHP文件中的文件夹名称。因此它将返回所有图像&#39; JSON格式的名称。别忘了在&#34; getfolders&#34;中指定这个PHP文件。文件&#34; param&#34;字段。

好的。所以这是一种算法。如果您有些困惑,请重新阅读。现在我将展示一些代码。

我做了两个活动(Didn并不喜欢片段)。一个显示专辑,另一个显示其中的图像。

活动1-&gt; 解析 getfolders 文件并检索我们之前指定的相册。

相册标题:上述JSON的 sub 字段 ,相册缩略图:上述JSON的内容字段 ,(隐藏自用户)图像名称列表: param 字段

因此,我们可以使用此信息在Recyclerview中显示它。现在我们为其项目指定OnClickListener。

点击项目 - > 使用Intent启动第二个活动并传递相册名称,该名称本质上是我们服务器上的文件夹名称。因此,我们可以访问包含图像的文件夹。也通过&#34; param&#34;场价值。这给了我们一个网址&#34; www.mywebsite.com /..../ alreadyspecifieddirectory / 1.php&#34;

活动 - &gt; 2 实施GridLayoutManager以向用户显示图片。使用getIntent()检索先前传递的值。首先,我们需要执行此PHP文件并解析JSON内容。这是一些代码:

 private void loadJSON(){
        StringRequest stringRequest = new StringRequest(Request.Method.GET,
                URL_DATA,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONObject jsonObject = new JSONObject(response);
                            for (int i=2; i<jsonObject.length()+2;i++){
                                String value =jsonObject.getString(String.valueOf(i));
                                if (value.length()!=0) {
                                    ListItem item = new ListItem(value, mParam1+"/"+value, "nothing");
                                    listItems.add(item);
                                }
                            }
                            adapter = new PhotoLibraryAdapter(Photos.this,listItems,photosList,true);
                            photosList.setAdapter(adapter);
                            progressBar.setVisibility(View.GONE);
                        } catch (Exception e) {progressBar.setVisibility(View.GONE);}
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                progressBar.setVisibility(View.GONE);
            }
        });
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }

请注意我们从2开始循环,因为PHP文件从索引2返回值,因为值0和值1是废值并命名为&#34;。&#34;和&#34; ..&#34;分别

因此我们得到了可以传递给url的图像名称: &#34; www.mywebsite.com /.../ albumnameretrievedearlier / imagenamegivenbyPHPfile&#34;

并将其传递给适配器,以便我们可以使用Picasso库加载图像。

那就是它!如果您有任何疑问,请随时在评论中提问。

编辑1:以下是它的外观: