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

时间:2011-08-11 22:25:57

标签: java javascript database servlets file-upload

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

所以假设:

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

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

2 个答案:

答案 0 :(得分:11)

对于文件上传部分,您需要在HTML表单上设置enctype="multipart/form-data",以便webbrowser发送文件内容,并且您希望在servlet的request.getPart()中使用doPost()将文件作为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的服务器内存。

答案 1 :(得分:1)

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

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

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