Javascript 向servlet发送二进制数据

Javascript 向servlet发送二进制数据,javascript,file-upload,firefox-addon,xmlhttprequest,Javascript,File Upload,Firefox Addon,Xmlhttprequest,我正在尝试将文件发送到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

我正在尝试将文件发送到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的来源:

但是不起作用

您好,这是使用的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和requisiçoéenviada实现全方位的欧盟环境。马斯奥·阿奎沃·恩奥克里亚多没有仆人。没有一个不完整的场地


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

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


只需像文档中所说的那样使用fileUpload设置一个servlet,然后用一个包含文件上传输入的表单创建一个简单的html页面,并将其用作基本功能测试,以查看它是否工作,然后返回到创建自己的客户机

注意您使用的示例代码是如何使用方法
PUT
-valid
multipart formdata
发送数据的,请求需要有一些额外的头,而不仅仅是文件本身。例如,您发送的文件应该有一个名称(通常是表单字段的名称)。相反,它将自动生成一个有效的请求。你应该能够直接。大致如下:

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开始,才支持创建这样的
文件
对象。

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