【问题标题】:Preserve image names in MySQL Blob在 MySQL Blob 中保留图像名称
【发布时间】:2014-08-16 18:06:45
【问题描述】:

我正在将图像上传到 Blob 中的数据库,但文件名已更改为 database_name-table_name.bin.png,这不太好。

是否有保留上传它们的应用程序使用的名称?

我用来上传它们的java代码(准备好的语句)是:

FileInputStream inputStream = null;

// Directory with the name i want to use
File image = new File(CreateArticleController.articleDetails.get("introImg")); 

inputStream = new FileInputStream(image);

pstmt.setBinaryStream(7, (InputStream) inputStream,(int) (image.length()));

数据库:

CREATE TABLE IF NOT EXISTS `temp_article` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  `author` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  `author_id` int(10) NOT NULL,
  `type` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `wfurl` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  `intro` text COLLATE utf8_unicode_ci NOT NULL,
  `intro_image` mediumblob NOT NULL,
  `status` int(10) NOT NULL DEFAULT '0',
  `main_image` mediumblob NOT NULL,
  `content_1` text COLLATE utf8_unicode_ci,
  `image_1` mediumblob,
  `content_2` text COLLATE utf8_unicode_ci,
  `image_2` mediumblob,
  `content_3` text COLLATE utf8_unicode_ci,
  `image_3` mediumblob,
  `content_4` text COLLATE utf8_unicode_ci,
  `image_4` mediumblob,
      // Images and content areas go on for 17 of each
  PRIMARY KEY (`id`)
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;

【问题讨论】:

  • 请发布您的表架构。
  • @chrylis - 发布数据库设置
  • 文件名存储在哪里?我以为 mysql blob 字段只会存储字节
  • 您究竟是如何从 blob 中下载图像的?我的感觉是某些应用程序正在生成此名称。它是一些 mysql 前端吗?
  • 我不太了解 phpmyadmin,但也许您需要定义类似 phpmyadmin.readthedocs.org/en/latest/transformations.html 的内容 - 此外,您可能需要将原始文件名存储在数据库中的某个位置跨度>

标签: java mysql phpmyadmin blob


【解决方案1】:

这里有几个因素。首先,您实际上并没有将原始文件名存储在任何地方。为了稍后检索它,您必须在上传时将其存储在某个地方。 phpMyAdmin 是管理员管理其数据库的工具,并非真正设计用于查看和下载您的图像。当然,您可以通过它完成这两项操作,但我的意思是,由于您想要操作下载的文件名,因此您需要自己的定制软件;由于 phpMyAdmin 是一个管理工具,它的设计目的不是那样。所以这将我们带到第三部分,这是您问题的最终答案:由下载工具提供名称。当您编写代码的下载部分时,您可以让它组成一个文件名,从数据库中提取存储的原始文件名,或者只使用通用默认值。这完全取决于您实现的代码。您(希望)不打算让最终用户通过 phpMyAdmin 下载图像,因此也要显示该代码。

所以回顾一下,因为我已经啰嗦了:修改你的表结构以添加一个字段来存储文件名,然后在创建时存储它,并在下载时检索它。

另外,(这是次要的,但是是好的设计原则)看起来您的数据库设计缺乏规范化(例如参见this,尽管有很多很多关于它的文章)。任何时候,只要表中的列名称为image_1image_2 等,这都是一个很好的指标,表明您可以对结构执行一些规范化。此外,您通常希望将图像存储在远离标题和作者等内容的另一个表中,以保持对非 BLOB 字段的访问速度(一般来说,BLOB 列似乎会减慢表的访问速度)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-30
    • 2022-07-18
    • 1970-01-01
    • 2015-02-05
    • 2015-02-01
    • 2013-07-19
    • 1970-01-01
    • 2022-08-26
    相关资源
    最近更新 更多