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

IT技术 java javascript database servlets file-upload
2021-02-25 07:40:13

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

所以假设:

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

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

2个回答

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

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

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

您不一定需要将其转换InputStreambyte[],它也不会具有内存效率。想象一下,100 个用户同时上传 10MB 的图像,那么此时将分配 1GB 的服务器内存。

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

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

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

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

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