javascript - JSP、JavaScript : display byte[] as image

标签 javascript java html jsp

我使用以下代码片段从文件中选择和读取图像:

<div class="col-md-6 form-group">
<input type='file' name="image" onchange="readURL(this);"
                    class="form-control" /> 
<img id="userimg" src="#" alt="" />
</div>

.js:

function readURL(input) {
    if (input.files && input.files[0]) {
        var reader = new FileReader();

        reader.onload = function (e) {
            $('#userimg')
                .attr('src', e.target.result)
                .width(150)
                .height(200);
        };

        reader.readAsDataURL(input.files[0]);
    }
}

在我的 servlet 中,我将文件转换为 byte[]:

(request.getParameter("image")).getBytes()

并将其插入数据库。

然后,我尝试从数据库中读取它并显示在 .jsp 页面中,如下所示:

.jsp

  <div class="panel panel-success">
                        <h2>Pictures</h2>
                        <%
                            List<byte[]> pics = PictureTable.getConcertPictures(concertBean.getId());
                        %>
                        <%
                            for (byte[] p : pics) {
                                String encoded = ImageHelper.encodeImage(p);
                        %>
                        <img src="data:image/jpg;base64,<%=encoded%>">
                        <%
                            }
                        %>
    </div>

ImageHelper.java:

public static String encodeImage(byte[] img) {
        return Base64.encode(img);
    }

但是图像没有正确显示(某些内容确实被插入到数据库中)。

编辑:

我修改了我的代码:

.jsp:

<div class="comments">
                <div class="panel panel-success">
                    <h2>Pictures</h2>
                    <%
                        List<byte[]> pics = PictureTable.getConcertPictures(concertBean.getId());
                    %>
                    <%
                        for (byte[] p : pics) {
                            String encoded = ImageHelper.encodeImage(p);
                    %>
                    <img src="data:image/jpg;base64,<%=encoded%>">
                    <%
                        }
                    %>
                </div>
                <!-- /container -->
                <form
                    action="GalleryController?action=add_concert_picture&concertID=<%=concertBean.getId()%>"
                    method="post" class="panel panel-success"
                    enctype="multipart/form-data">
                    <div class="col-md-6 form-group">
                        <input type='file' name="image" class="form-control" />
                    </div>
                    <button type="submit" class="btn">Submit</button>
                </form>
            </div>

servlet:

Part filePart = request.getPart("image");
InputStream fileContent = filePart.getInputStream();
PictureTable.insertConcertPicture(cid, user.getUser().getId(), fileContent);

PictureTable.java:

public static void insertConcertPicture(int concertId, int userId, InputStream photo) {
        try (Connection connection = ConnectionPool.getConnectionPool().checkOut()) {

            PreparedStatement ps = connection
                    .prepareStatement("INSERT INTO concertphototable(ConcertId, UserId, Photo) VALUES(?,?,?)");

            ...
            ps.setBinaryStream(3, photo);

            ps.executeUpdate();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

图像仍然无法正确显示,但现在页面的“提交”部分甚至不可见。

最佳答案

有很多方法可以做到这一点。我将返回 base64 字符串并将其存储在数据库中。然后你可以将它返回给JSP来渲染它。

为此,您必须:

<input type="file" name="file" onchange="encodeImageFileAsURL(this)" />
<form method="POST" action="/upload">
    <input id="image" type="text" name="image" value="asdf" /><br />
    <br /> <input type="submit" value="Submit" />
</form>
<script type="text/javascript">
    function encodeImageFileAsURL(element) {
        var file = element.files[0];
        var reader = new FileReader();
        reader.onloadend = function() {
            document.getElementById("image").value = reader.result;
        }
        reader.readAsDataURL(file);
    }
</script>

在您的/upload Controller 中:

@PostMapping("/upload")
public ModelAndView singleFileUpload(@RequestParam("image") String image, RedirectAttributes redir) {
    jdbcTemplate.update("INSERT INTO concertphototable(ConcertId, UserId, Photo) VALUES(?, ?, ?)", 1, 1, image);
    String imageString = jdbcTemplate.queryForObject("Select Photo from concertphototable where ConcertId = " + 1,
            String.class);
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("redirect:uploadStatus");
    redir.addFlashAttribute("image", imageString);
    return modelAndView;
}

然后进入uploadStatus页面:

<img src=${image}>

不要对 Spring 部分感到困惑,您应该记住,您必须将 base64 字符串从 jsp 发布到服务器,然后存储它。然后将其作为字符串检索并将其传递到图像 src 标记中的 jsp,然后将显示图像。如果没有特定原因需要将图像作为 blob 存储到数据库中,则必须采用上述方法。

关于javascript - JSP、JavaScript : display byte[] as image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47930516/

相关文章:

javascript - 如何在 apache 中托管预压缩的静态内容?

javascript - 是否有任何 "on DOM change"事件?

javascript - html5 Canvas绘制图像背景+ 9张图像

javascript - IE 上缺少 Paypal In-Context Express Checkout 按钮

javascript - 在函数内部修改变量后,为什么变量未更改? -异步代码引用

java - 货币:小数位数意外为零

java - 使用箭头键或 Controller 导航 MainMenu

java - Toplink & java存储word或pdf文件

javascript - $ ('#iframe' ).height 不工作

html - 如何跨列应用字体系列样式