Отправка двоичных данных в сервлет - PullRequest
1 голос
/ 23 сентября 2011

Я пытаюсь отправить файл сервлету.

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

Но когда я пытаюсь отправить файл, сервлет не создает отправленный файл. Quando eu tento enviar с помощью javascript и 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, неполон.

Ответы [ 2 ]

2 голосов
/ 24 сентября 2011

Обратите внимание, что пример кода, который вы используете, отправляет данные методом PUT - допустимый multipart-formdata запрос должен иметь несколько дополнительных заголовков, а не только сам файл.Например, файл, который вы отправляете, должен иметь имя (обычно это имя поля формы).Вместо этого следует использовать FormData объект , он автоматически сгенерирует действительный запрос.Вы должны иметь возможность создать File объект напрямую.Что-то вроде этого:

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 голосов
/ 23 сентября 2011

Скорее всего, проблема заключается в том, как вы пытаетесь получить загруженный файл с сервлетом. Будучи низкоуровневой имплементацией, сервлет не имеет большой абстракции для обработки загруженных файлов (многочастных запросов). К счастью, есть библиотеки, которые позаботятся об этом для вас, например, commons.FileUpload:

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

Просто настройте сервлет с fileUpload, как это описано в документе, затем создайте простую HTML-страницу с формой, имеющей вход для загрузки файла, и используйте ее в качестве базового функционального теста, чтобы убедиться, что он работает, затем вернитесь сделать свой собственный клиент.

...