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

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

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

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

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

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

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

从它的外观来看,你需要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作为外键存储所有图像及其路径和它们所属的专辑

您对所有图像的查询都是

 SELECT * FROM `images`; 

来自特定专辑的图像将被查询

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

SQL查询的输出可以使用JSON编码

 json_encode($query_result); //PHP code 

编辑 : Android Hive上的Gallery App示例

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

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

您需要PHP中的两个API端点

上传images / api / upload

  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. 列出图像

首先列出上传目录下的所有目录:

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

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

编辑

 // 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

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

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

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

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

抱歉英文不好……

这些图像在您的数据库中保存为Blobtypes,或者您保存某种types的链接?

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

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

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

快乐的编码!

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

blobtypes可以不同。 一方面,他可以指sql blobtypes 。 最重要的是像这里的MIMEtypes

如果您使用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数据库中的实际图像(除了语法之外,这与其他数据库没有什么不同)
  2. 这里有一个有点混乱的BLOB处理例子
  3. 这里用Java处理BLOB的例子

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

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

Java框架

有趣的PHP框架

PHP后端教程

在线课程

祝你好运!

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

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

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

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

  1. Blobstore API for Java概述
  2. Google云端存储

我自己find了解决方案。 它很容易理解和实现,只需要JSON的知识。 首先,请从我的网站目录中查看此图片:

“event1”,“event2”文件夹是专辑名称。 我们可以创造所需的数量。

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" } ] } 

我们在这里存储相册名称,您可以在“子”字段中看到。 “content”字段包含指向相册缩略图的链接,“param”包含相应PHP文件的名称。 别担心,你不需要学习PHP。 这是一个现成的脚本。

1.PHP

  

这个PHP文件有什么作用? 它列出了指定文件夹中存在的所有文件名。 如您所见,我们在此PHP文件中指定了“ event1 ”作为文件夹名称。 因此它将以JSON格式返回所有图像的名称。 不要忘记在“getfolders”文件的“param”字段中指定此PHP文件。

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

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

活动1->解析getfolders文件并检索我们之前指定的专辑。

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

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

单击项目 – >使用Intent启动第二个活动并传递专辑名称,该名称基本上是我们服务器上的文件夹名称。 因此,我们可以访问包含图像的文件夹。 还传递“param”字段值。 这给了我们一个url“www.mywebsite.com/…./alreadyspecifieddirectory/1.php”

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

  private void loadJSON(){ StringRequest stringRequest = new StringRequest(Request.Method.GET, URL_DATA, new Response.Listener() { @Override public void onResponse(String response) { try { JSONObject jsonObject = new JSONObject(response); for (int i=2; i 

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

因此,我们得到了可以通过URL传递的图像名称:“www.mywebsite.com/.../albumnameretrievedearlier/imagenamegivenbyPHPfile”

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

而已! 如果您有任何疑问,请随时在评论中提问。

编辑1:这是它的样子: