【问题标题】:Upload the image with preview上传带预览的图片
【发布时间】:2009-12-22 07:45:16
【问题描述】:

您好,我想使用 jsp 和 servlet 上传图像(以及其他表单详细信息)并预览它们。我能够完成上传部分,但无法获得如何在前端预览图像。

我正在使用 YUI 来实现它。实际上,我正在尝试重用一个用 PHP 实现的示例。我在这里附上我的 Servlet 代码。上传完成后,此“completeFileName”将被填充。

   protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {            

            if(completeFileName == null) {
                PrintWriter pout = response.getWriter();
                JSONObject obj = new JSONObject();
                obj.put("hasError", new Boolean(true));
                pout.println(obj.toString());
            }
            try {

                OutputStream out = response.getOutputStream();
                Image image = Toolkit.getDefaultToolkit().getImage(completeFileName);
                ImageIcon icon = new ImageIcon(image);
                int height = icon.getIconHeight();
                int width = icon.getIconWidth();
  BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                ImageIO.write(bi, "jpg", out);
                out.flush();                
            } catch (Exception ex) {

            }

我的 Jsp 代码如下所示:

<script type="text/javascript" src="http://yui.yahooapis.com/2.3.0/build/connection/connection.js"></script>
        <script type="text/javascript" src="http://yui.yahooapis.com/2.3.0/build/utilities/utilities.js"></script>
        <script type="text/javascript">
            var $E = YAHOO.util.Event;
            var $  = YAHOO.util.Dom.get;
            var $D = YAHOO.util.Dom;
            function init(){
                var listImageHandler = {
                    success:function(o) {
                        var r = eval('(' + o.responseText + ')');
                        if(!r.hasError) {
                            var imageListCon = $('imageListCon');
                            var img = document.createElement('img');
                            //img.src = 'image.php?i=' + r.imageList[i];
                            img.src = r.fileName;
                            imageListCon.appendChild(img);
                        }
                    }
                };
                var onUploadButtonClick = function(e){
                    var uploadHandler = {
                        upload: function(o) {
                            //console.log(o.responseText);
                            $D.setStyle('indicator', 'visibility', 'hidden');
                            var r = eval('(' + o.responseText + ')');
                            if(r.hasError){
                                var errorString = '';
                                for(var i=0; i < r.errors.length; i++){
                                    errorString += r.errors[i];
                                }
                                alert(errorString);
                            }else{
                                YAHOO.util.Connect.asyncRequest('GET', 'UploadFileServlet', listImageHandler);
                            }
                        }
                    };
                    $D.setStyle('indicator', 'visibility', 'visible');
                    //the second argument of setForm is crucial,
                    //which tells Connection Manager this is an file upload form
                    YAHOO.util.Connect.setForm('testForm', true);
                    YAHOO.util.Connect.asyncRequest('POST', 'UploadFileServlet', uploadHandler);

                };
                $E.on('uploadButton', 'click', onUploadButtonClick);
                YAHOO.util.Connect.asyncRequest('GET', 'UploadFileServlet', listImageHandler);
            }

            $E.on(window, 'load', init);
        </script>        
    </head>
    <body>
        <form action="UploadFileServlet" method="POST" enctype="multipart/form-data" id="testForm">        
        <input type="file" name="testFile"><br>
        <input type="button" id="uploadButton" value="Upload"/>
        </form>
        <div class="restart"><a href="UploadFileServlet?redo=1">Redo It</a></div>
        <div  style="visibility:hidden; margin-bottom:1.5em;" id="indicator">Uploading... <img src="indicator.gif"/></div>
        <div id="imageListCon">

        </div>
    </body>

我无法得到回复,有人可以帮忙吗?

谢谢, 阿米特

【问题讨论】:

    标签: javascript jquery jsp servlets yui


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      由于安全限制,您无法在上传前在前端预览图片

      【讨论】:

        【解决方案3】:

        如果您已经能够将图像上传到服务器的文件夹中,则可以轻松地在页面中显示带有图像控件的图像。让该文件夹成为一个临时文件夹,您可能希望在上传完成后清空该文件夹。然后你首先上传临时文件夹中的文件并将其显示给用户。如果用户取消操作,您可以从文件夹中删除文件。

        但请记住,这不是我们通常想象的真实图像预览。但由于这模仿了图像预览,因此它可能是一种选择。

        【讨论】:

          【解决方案4】:

          我不知道 YUI,所以我不能详细说明这一点,但我至少可以看出你的逻辑有几个缺陷:你试图将图像的整个二进制内容写回去到 ajax 响应。这是行不通的。在 HTML 中,您只能使用 &lt;img&gt; 元素显示图像,其 src 属性应指向有效的 URL。比如:

          <img src="/images/uploadedimage.jpg">
          

          为此,只需将图像存储在本地磁盘文件系统或服务器端的数据库中,并在 ajax 响应中返回客户端可以访问图像的 URL。让 ajax 成功处理程序创建一个 DOM 元素 &lt;img&gt; 并用获取的 URL 填充其 src 值。

          您需要创建一个Servlet,它侦听此 URL,并通过FileInputStream 从本地磁盘文件系统或通过ResultSet#getBinaryStream() 从数据库中以InputStream 的形式获取图像,并将其写入响应的OutputStream,以及一组正确的响应标头,至少有content-type。您可以找到here 此类 servlet 的示例。

          也就是说,您确实不需要 Java 2D API。 ImageImageIcon 只会不必要地增加很多开销。只需将其作为InputStream 获取,然后以通常的Java IO 方式将其写入响应的OutputStream

          【讨论】:

          • 嘿,Balusc,谢谢。如果你也帮助我处理 JS 部分,我将非常感激。
          • 如前所述,我不做 YUI。我只做纯 JS 或 jQuery。
          • 我猜 YUI 让事情变得非常复杂。纯 JS 或 JQuery 将达到目的。你能帮我解决这个问题吗?
          • 这不是火箭科学: 1) Ajax 获取图像 URL 作为结果。 2) 在 DOM 中创建 img 元素。 3) 用这个 URL 设置它的 src 属性作为值。 4)使其显示在页面中。就这样。像这样使用 jQuery:succes: function(url) { $('&lt;img/&gt;').attr('src', url).appendTo($('#somediv')); }
          • 您好,我想知道,您为 servlet 引用的链接中的示例是适用于在 jsp 中实现的多部分表单数据的 servlet。
          猜你喜欢
          • 2015-07-22
          • 1970-01-01
          • 2014-08-06
          • 1970-01-01
          • 2020-06-25
          • 2014-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多