【问题标题】:Sending binary data to a servlet将二进制数据发送到 servlet
【发布时间】:2011-09-24 17:06:29
【问题描述】:

我正在尝试将文件发送到 servlet。

function sendToServlet(){

var file = Components.classes["@mozilla.org/file/local;1"].  
           createInstance(Components.interfaces.nsILocalFile);  
file.initWithPath("C:\\Documents and Settings\\me\\Meus documentos\\Downloads\\music.mp3"); 

var boundary = "--------------" + (new Date).getTime();

var stream = Components.classes["@mozilla.org/network/file-input-stream;1"]  
                       .createInstance(Components.interfaces.nsIFileInputStream);  
stream.init(file, 0x04 | 0x08, 0644, 0x04); // file is an nsIFile instance     


// Send      
var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]  
                    .createInstance(Components.interfaces.nsIXMLHttpRequest);  
req.open('POST', 'http://localhost:8080/app/server'  , false); 
var contentType = "multipart/form-data; boundary=" + boundary;
    req.setRequestHeader("Content-Type", contentType);
req.send(stream);  

}

javascript的来源: https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest#Sending_binary_data

但不起作用。

您好,这是使用的服务代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

         int size = 1024*20000;  
         long sizeFile = 0;
         File savedFile = null;      

         boolean isMultipart = ServletFileUpload.isMultipartContent(request);
         if (!isMultipart) {
         } else {
               FileItemFactory factory = new DiskFileItemFactory();
               ServletFileUpload upload = new ServletFileUpload(factory);
               upload.setFileSizeMax(new Long("-1"));
               List items = null;
               try {
                   items = upload.parseRequest(request);
               } catch (FileUploadException e) {
                   e.printStackTrace();
               }
               Iterator itr = items.iterator();
               while (itr.hasNext()) {
               FileItem item = (FileItem) itr.next();

                   try {

                       if (item.isFormField()) {
                            ;
                       }else{

                           String itemName = item.getName();
                           int sizeName = itemName.length();
                           int end  = itemName.indexOf('\n');
                           int start = itemName.lastIndexOf('\\');
                           itemName = itemName.substring(start + 1, sizeName-end-1);

                           savedFile = new File("C:\\Documents and Settings\\eric.silva\\Meus documentos\\"+itemName);
                           item.write(savedFile);  
                       }                       

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

但是当我尝试发送文件时,servlet 不会创建发送的文件。 Quando eu tento enviar via javascript a requisição é enviada。 Mas o arquivo não é criado no lado do servidor。 Acredito que o código apresentado no site da MDN esteja incompleto。

当我尝试通过 javascript 发送请求时。但是该文件不是在服务器端创建的。我认为 MDN 网站上显示的代码不完整。

【问题讨论】:

    标签: javascript file-upload firefox-addon xmlhttprequest


    【解决方案1】:

    请注意,您使用的示例代码如何使用 PUT 方法发送数据 - 有效的 multipart-formdata 请求需要有一些额外的标头,而不仅仅是文件本身。例如,您发送的文件应该有一个名称(通常是表单域的名称)。你应该 use a FormData object 代替,它会自动生成一个有效的请求。您应该可以直接create a File object。大致如下:

    var file = File("C:\\Documents and Settings\\me\\Meus documentos\\Downloads\\music.mp3");
    var data = new FormData();
    data.append("file", file);
    var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]  
                        .createInstance(Components.interfaces.nsIXMLHttpRequest);  
    req.open('POST', 'http://localhost:8080/app/server', false);
    request.send(data);
    

    请注意,仅从 Firefox 6 开始支持创建这样的 File 对象。

    【讨论】:

    • 嗨 Wladimir,当我将此代码发布到我的插件 (main.js) 中时,在转换为 Chrome-Auth 样式(Cc、Ci 等)后,它给了我“文件未定义,指代码中的第一行。如何在 main.js 中使用它?
    • @Bora:是的,File 构造函数没有在附加 SDK 模块的上下文中定义。您必须从某些上下文中“窃取”它,例如像这样:var {File} = Cu.import("resource://gre/modules/Services.jsm", null);
    • 我刚刚发现,nsIDOMWindowUtils 对象有一个 wrapDOMFile 方法,这正是我所需要的。偷窃显然是另一种可行的解决方案。
    • 另外,FormData.append() 方法还有一个可选的第三个参数,它接受文件名,只要它是 File 或 Blob。
    【解决方案2】:

    问题更可能在于您如何尝试使用 servlet 获取上传的文件。作为一个低级的实现,servlet 没有太多的抽象来处理上传的文件(多部分请求)。幸运的是,有一些图书馆会像 commons.FileUpload 一样为您解决这个问题:

    http://commons.apache.org/fileupload/using.html

    只需像文档中所说的那样使用 fileUpload 设置一个 servlet,然后使用具有文件上传输入的表单制作一个简单的 html 页面,并将其用作基本功能测试以查看它是否有效,然后返回做你自己的客户。

    【讨论】:

      猜你喜欢
      • 2011-07-08
      • 1970-01-01
      • 2019-01-07
      • 2017-11-14
      • 2012-09-10
      • 2019-10-04
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多