2011-09-23 54 views
1

我想将一个文件发送到一个servlet。发送二进制数据到一个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

但不起作用。

嗨,用这个的serlevt代码:

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不创建发送的文件。 请通过JavaScript获得需要的环境。 Mas o arquivonãoécriado no lado do servidor。 Acredito que ocódigoapresentado no site da MDN esteja incompleto。

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

+0

Parece阙énecessário嗯cabeçalho,一个funçãosendToServlet NAO adiciona。观察者需要知道如下信息:----------------------------- 14600727820799 Content-Disposition:form-data; NAME = “F1”;文件名=“music.mp3”内容类型:audio/mpeg – user916933

回答

2

请注意您使用的示例代码是如何使用方法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); 

注意,创建File对象像这样仅支持开始使用Firefox 6

+0

嗨弗拉基米尔,当我将这段代码加入我的插件(main.js)后,转换为Chrome-Auth样式(Cc,Ci等)后, “文件没有被定义,指的是代码中的第一行 如何在main.js中使用它? – Bora

+1

@Bora:是的,File的构造函数没有在Add-你必须从某个上下文中“偷”它,例如:'var {File} = Cu.import(“resource://gre/modules/Services.jsm”,null);' –

+0

我只是发现,'nsIDOMWindowUtils'对象有一个'wrapDOMFile'方法,它完全符合我的需要。窃取显然是另一种可行的解决方案。 – Bora

0

问题在于如何尝试使用servlet获取上传的文件。作为低级别的推理,servlet没有太多的抽象来处理上传的文件(多部分请求)。幸运的是谁照顾,对你喜欢commons.FileUpload库:

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

只要设置了文件上传一个servlet像它在doc最高审计机关,然后做一个简单的HTML页面,有一个表格一个文件上传输入,并将其用作基本功能测试以查看其工作情况,然后返回到创建自己的客户端。