如何上传图像并将其保存在数据库中?
我必须使用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它。