如何上传图片并保存到数据库?

10

我需要使用JavaScript创建一个表单,用户将上传一个JPG文件并提交其他信息,例如姓名、电子邮件等。当用户点击提交按钮时,表单中的所有信息将被加载到值对象中。对于图像文件,我已将其设置为byte[]

因此,假设:

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

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


http://www.java2s.com/Code/Java/Database-SQL-JDBC/Stream-Data.htm - mKorbel
我认为最好将文件保存到上传目录中,并将文件路径保存在数据库中。 - scott
这正是我所想的,但我使用的表将被定期删除,可能每周一次。此外,条目数量不会太多,因为我每周只需要创建新广告3-5次,所以每周最多只有10个条目。 - iCodeLikeImDrunk
2个回答

11

在文件上传部分,您需要在HTML表单上设置enctype="multipart/form-data",以便网络浏览器可以发送文件内容,您需要在servlet的doPost()方法中使用request.getPart()来获取文件作为InputStream。有关具体代码示例,请参见如何使用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")的图片,然后提交。图片的数据保存在哪里?我想这是我困惑的主要问题,我将其传递给一个servlet,然后进行Java处理,这部分我可以处理。 - iCodeLikeImDrunk
正如所说,浏览器将文件内容包含在 multipart/form-data 请求体中。运行 HTTP 流量调试器或打印 HttpServletRequest#getInputStream() 以亲眼查看。另外,这个答案可能很有启发性:https://dev59.com/_3VD5IYBdhLWcg3wHnyd#3374408 - BalusC
所以我不需要将那个信息设定到任何变量中吗?我只需要使用 request.getAttribute(name) 吗?抱歉问这么愚蠢的问题,但我从未涉及上传和下载文件等相关工作... - iCodeLikeImDrunk
哦,我说过不要使用 request.getAttribute()。你有读完我第一段结尾处的具体代码示例链接吗? - BalusC
抱歉,我在我的导师的代码中没有看到任何准备声明或连接,我认为这一切都已经设置好了。 - iCodeLikeImDrunk
显示剩余2条评论

2
您不应该将图像存储在数据库中。数据库是存储二进制数据最昂贵的地方,数据库大小会快速增长,查询成本也很高。您可能会得到一个不可扩展且效率低下的图像托管解决方案。
请将其存储在独立的资源服务器上,例如Amazon S3或其他任何地方(本地Nginx、Tomcat等)。
相反,您可以存储唯一的文件名和/或完整路径以让数据库的工作负载更轻松,并使列数据可读,这样您就可以快速找到所需的图片。我甚至没有谈论性能问题,简单的基准测试将很容易证明它。

1
是的,这就是我像个菜鸟一样编码的时候。现在我将元数据保存到数据库,图像保存到S3。 - iCodeLikeImDrunk
我很高兴你有进步 :) 我有点错过了问题的日期 =\ - Mikhail Kholodkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接