在MySQL Blob中保留图像名称

时间:2014-06-26 01:38:51

标签: java mysql phpmyadmin blob

我将图像上传到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 ;

1 个答案:

答案 0 :(得分:0)

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

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

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