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

我必须使用JavaScript创建表单,用户将上传JPG文件并提交其他信息,如姓名,电子邮件等。当用户单击提交时,表单中的所有信息都将加载到值对象。 对于图像文件,我将其设置为byte[]

所以假设:

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

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

对于文件上传部分,您需要在HTML表单上设置enctype="multipart/form-data" ,以便webbrowser发送文件内容,并且您希望在servlet的doPost()方法中使用request.getPart()将文件作为InputStream 。 有关具体的代码示例,另请参阅如何使用JSP / Servlet将文件上载到服务器?

然后,要将此InputStream保存在DB中,只需在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的服务器内存。

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

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

相反,您可以存储文件的唯一文件名和/或完整路径。 通过这种方式,您可以方便DB的工作量,并且列数据将是可读的,因此您可以快速找到所需的图片。 我甚至不是在谈论性能,简单的基准测试很容易certificate它。