如何上传图像并将其保存在数据库中? [复制]

Posted

技术标签:

【中文标题】如何上传图像并将其保存在数据库中? [复制]【英文标题】:How to upload an image and save it in database? [duplicate] 【发布时间】:2011-10-25 09:49:15 【问题描述】:

我必须使用 javascript 创建一个表单,用户将上传一个 JPG 文件并连同其他信息(例如姓名、电子邮件等)一起提交。当用户单击提交时,表单中的所有信息将被加载到一个值目的。对于图像文件,我将其设置为byte[]

所以假设:

public String name;
public String email;
public byte[] logo;

我也设置了一个 servlet 来处理提交,但我不知道如何开始。上传是如何工作的?当用户提交时,我如何获取图像的信息?这是一个屏幕截图:http://imageshack.us/f/32/77675354.png/ 我需要转换该图像并将其保存到 byte[] 然后转换为 blob,以便我可以将其插入到表格中。

【问题讨论】:

java2s.com/Code/Java/Database-SQL-JDBC/Stream-Data.htm 我认为最好将文件保存到上传目录,并将文件路径保存在db中 我也是这么想的,但是我使用的表格会定期删除,可能每周一次也不会有大量条目,因为我只需要制作新广告可能每周 3-5 次,所以每周最多 10 个条目.. 【参考方案1】:

对于文件上传部分,您需要在 html 表单上设置enctype="multipart/form-data",以便网络浏览器发送文件内容,并且您想在 servlet 的 doPost() 方法中使用 request.getPart() 获取文件为一个InputStream。具体代码示例,另见How to upload files to server using JSP/Servlet?

然后,要将此InputStream 保存在数据库中,只需在BLOB/varbinary/bytea 列或您最喜欢的数据库引擎中代表“二进制数据”的任何列上使用PreparedStatement#setBinaryStream()

preparedStatement = connection.prepareStatement("INSERT INTO user (name, email, logo) VALUES (?, ?, ?)");
preparedStatement.setString(1, name);
preparedStatement.setString(2, email);
preparedStatement.setBinaryStream(3, logo);
// ...

您不一定需要将此InputStream 转换为byte[],它也不会节省内存。假设 100 个用户同时上传 10MB 的图片,那么此时将分配 1GB 的服务器内存。

【讨论】:

你能向我解释一下吗:在我创建的表单中,用户选择一个带有 dir("c:\pic.png") 的图片,然后提交 什么保存了 PIC 的数据?我认为这是我最困惑的主要事情,我将它传递给一个 servlet,然后它的 java 东西我可以处理。 如前所述,浏览器将文件内容包含在multipart/form-data 请求正文中。运行 HTTP 流量调试器或打印 HttpServletRequest#getInputStream() 以亲眼看到它。在相关的说明中,这个答案可能很有启发性:***.com/questions/81180/… 所以我不需要将该信息设置为任何变量?我只做 request.getAttribute(name) 吗?抱歉这些愚蠢的问题,但我从来没有上传和下载文件等。 呃,我说无处使用request.getAttribute()。您是否阅读了我第 1 段末尾的具体代码示例的链接? sry.. 我在导师的任何代码中都没有看到任何准备好的陈述或联系,我认为所有这些都已经设置好了。【参考方案2】:

您可能不应该将图像存储在数据库中。 数据库实际上是您可以存储二进制数据的最昂贵的地方。数据库大小将快速增长,查询成本很高。您最终可能会得到不可扩展且几乎没有效率的图像托管解决方案。

将其存储在单独的资源服务器中,例如 Amazon S3 或其他任何地方(本地 nginx、Tomcat 等)。

相反,您可以存储唯一的文件名和/或文件的完整路径。这样可以方便DB的工作量,列数据可读,可以快速找到想要的图片。我什至不谈论一般的性能,简单的基准测试很容易证明这一点。

【讨论】:

是的,这是我像磨砂一样编码的时候。现在我将元数据保存到 db,图像保存到 s3。 我很高兴你取得了进步 :) 我有点错过问题的日期 =\

以上是关于如何上传图像并将其保存在数据库中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mean.js 上传图像并将其保存到数据库(猫鼬)

如何将图像上传到 Firebase 存储并将其添加到数据库中?

上传图像/文件并将其转换为 mysql 数据库

DreamFactory:如何将图像上传到文件服务器并将图像的路径保存在数据库中?

如何使用 GD 调整上传图像的大小并将其转换为 PNG?

如何使用 phalcon 上传多个图像并将其名称存储在数据库中?