当前位置: 首页 > 面试题库 >

HTML5文件上传到Java Servlet

桂学
2023-03-14
问题内容

我的问题有点说明了一切。我目前正在成功地将Uploadify(Flash + Ajax)用于Servlet(带有OWASP
ESAPI覆盖的公共上传),但是我想知道如何构建HTML5支持,或者说具有Flash支持的HTML5。

我知道如何使HTML5 DnD正常工作,但是我不太了解Java
Servlet连接和/或后端的机制。我搜索了很多地方,但找不到任何答案,因此,我们将不胜感激。


问题答案:

我知道如何使HTML5 DnD正常工作,但是我不太了解Java Servlet连接和/或后端的机制。

与使用常规时没有什么不同<form enctype="multipart/form-data">。您需要做的就是获取HTML5 /
JS代码,以multipart/form-data使用删除的文件发送请求,该请求与使用常规<input type="file">字段发送的请求完全相同。我假设您只是无法弄清楚如何使用HTML5 / JS实现这一目标。

您可以为此使用新的HTML5FileAPI,XHR2FormDataXMLHttpRequestUploadAPI。

这是drop事件处理程序外观的启动示例:

function dropUpload(event) {
    event.stopPropagation();
    event.preventDefault();

    var formData = new FormData();
    formData.append("file", event.dataTransfer.files[0]);

    var xhr = new XMLHttpRequest();
    xhr.open("POST", "uploadServlet");
    xhr.send(formData);
}

而已。本示例假定Servlet映射到的URL模式/uploadServlet。在此示例中,该文件随后以常规方式作为FileItem字段名称为的实例在ApacheCommons FileUpload中可用file

我使用以下SSCCE进行了一些处理:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>HTML5 drag'n'drop file upload with Servlet</title>
        <script>
            window.onload = function() {
                var dropbox = document.getElementById("dropbox");
                dropbox.addEventListener("dragenter", noop, false);
                dropbox.addEventListener("dragexit", noop, false);
                dropbox.addEventListener("dragover", noop, false);
                dropbox.addEventListener("drop", dropUpload, false);
            }

            function noop(event) {
                event.stopPropagation();
                event.preventDefault();
            }

            function dropUpload(event) {
                noop(event);
                var files = event.dataTransfer.files;

                for (var i = 0; i < files.length; i++) {
                    upload(files[i]);
                }
            }

            function upload(file) {
                document.getElementById("status").innerHTML = "Uploading " + file.name;

                var formData = new FormData();
                formData.append("file", file);

                var xhr = new XMLHttpRequest();
                xhr.upload.addEventListener("progress", uploadProgress, false);
                xhr.addEventListener("load", uploadComplete, false);
                xhr.open("POST", "uploadServlet", true); // If async=false, then you'll miss progress bar support.
                xhr.send(formData);
            }

            function uploadProgress(event) {
                // Note: doesn't work with async=false.
                var progress = Math.round(event.loaded / event.total * 100);
                document.getElementById("status").innerHTML = "Progress " + progress + "%";
            }

            function uploadComplete(event) {
                document.getElementById("status").innerHTML = event.target.responseText;
            }
        </script>
        <style>
            #dropbox {
                width: 300px;
                height: 200px;
                border: 1px solid gray;
                border-radius: 5px;
                padding: 5px;
                color: gray;
            }
        </style>
    </head>
    <body>
        <div id="dropbox">Drag and drop a file here...</div>
        <div id="status"></div>
    </body>
</html>

并且UploadServlet利用了新的Servlet 3.0 HttpServletRequest#getPart()API:

@MultipartConfig
@WebServlet("/uploadServlet")
public class UploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part file = request.getPart("file");
        String filename = getFilename(file);
        InputStream filecontent = file.getInputStream();
        // ... Do your file saving job here.

        response.setContentType("text/plain");
        response.setCharacterEncoding("UTF-8");
        response.getWriter().write("File " + filename + " successfully uploaded");
    }

    private static String getFilename(Part part) {
        for (String cd : part.getHeader("content-disposition").split(";")) {
            if (cd.trim().startsWith("filename")) {
                String filename = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
                return filename.substring(filename.lastIndexOf('/') + 1).substring(filename.lastIndexOf('\\') + 1); // MSIE fix.
            }
        }
        return null;
    }
}


 类似资料:
  • 问题内容: 我遇到了这个简单的js ajax上传代码(由于某种原因,jquery 似乎不适用于HTML5), 但是我这里有两个问题, 这条线在物体之后是什么意思? 为什么在那里需要ID?我能做些什么使用jQuery 用? 此ajax仅用于单个文件上传,如何更改多个文件上传? 问题答案: 这行在对象FormData之后是什么意思? 在得到由它的ID元件。该抓住从元件中的第一选择的文件。将其追加到与字

  • 本文向大家介绍javascript HTML5文件上传FileReader API,包括了javascript HTML5文件上传FileReader API的使用技巧和注意事项,需要的朋友参考一下 文件上传功能现在是越来越普遍,所有的社交网站,媒体网站,比如优酷视频,微博等,都提供了上传图片,上传视频等功能。但过去WEB程序员都很清楚,用HTML表单上传文件是很麻烦的事情,特别是你想了解一下用户

  • 问题内容: 我正在尝试使用html5的File API批量上传文件,然后在php的服务器端重新组装它。我正在上传视频,但是当我在服务器端合并文件时,文件大小增加了,并且变成了无效文件。请注意,以下html5代码仅适用于chrome浏览器。在Chrome 9中进行了测试,因为它使用了文件API的slice函数。有人可以指导我吗?谢谢 HTML来源 问题答案: Slice Function接受第二个参

  • 我有一个多文件上传表单: 我用ajax发布这些文件。我想一个接一个地上传选定的文件(为了创建单独的进度条,出于好奇)。 我可以通过以下方式获得文件列表或单个文件: 耶林 但是FileList是不可变的,我不知道如何提交单个文件。 我认为这是可能的,正如我所看到的http://blueimp.github.com/jQuery-File-Upload/.我不想使用这个插件,因为它与学习和结果一样重要

  • 问题内容: 我有多个文件上传表单: 我正在用ajax发布这些文件。我想一个接一个地上传所选文件(以创建单独的进度条,并且出于好奇)。 我可以通过以下方式获取文件列表或单个文件 耶陵 但是FileList是不可变的,我不知道如何提交单个文件。 我认为这是可能的,因为我看到了http://blueimp.github.com/jQuery-File- Upload/ 。我不想使用这个插件,因为它既要学

  • 本文向大家介绍Jquery结合HTML5实现文件上传,包括了Jquery结合HTML5实现文件上传的使用技巧和注意事项,需要的朋友参考一下 1.利用Jquery使用HTML5的FormData属性实现对文件的上传   在HTML5以前我们如果需要实现文件上传服务器等功能的时候,有时候我们不得不依赖于FLASH去实现,而在HTML5到来之后,我们很容易的实现对文件的上传,只需要利用HTML5的一个F