我将图像上传到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 ;
答案 0 :(得分:0)
这里有几个因素。首先,您实际上并未将原始文件名存储在任何位置。为了以后检索它,您必须在上传时将其存储在某个位置。 phpMyAdmin是管理员管理数据库的工具,而不是真正用于查看和下载图像的工具。当然,您可以通过它完成这两项工作,但我的意思是,既然您想操纵下载的文件名,那么您需要自己定制的软件;由于phpMyAdmin是一个管理工具,因此它不能像这样使用。这样就把我们带到了第三部分,这是你问题的最终答案:由下载工具提供一个名称。当您编写代码的下载部分时,可以让它组成文件名,从数据库中提取存储的原始文件名,或者只使用通用默认值。这完全取决于您实施的代码。您(希望)不打算让最终用户通过phpMyAdmin下载图像,因此也要显示该代码。
所以回顾一下,因为我得到了长篇大论:修改你的表结构,添加一个字段来存储文件名,然后在创建时存储它,并在下载时检索它。
另外,(这是次要的但是很好的设计原则)看起来你的数据库设计缺乏规范化(例如见this,尽管有很多很多关于它的文章)。每当表格包含名称为image_1
,image_2
等的列时,它就是您可以对结构执行某些规范化的良好指标。此外,您通常希望将图像存储在远离标题和作者之类的其他表中,以保持非BLOB字段的访问速度(一般来说,BLOB列似乎会减慢表访问速度)。