2015-04-07 3 views
3

Я создаю веб-приложение, используя Spark Java framework. Интерфейс разработан с использованием AngularJS.Отправка файлов с расширением .docx с сервера на клиент с помощью Spark

Я хочу сгенерировать файл .docx на сервере (в памяти) и отправить его клиенту для загрузки.

Для достижения этой цели я создал угловое обслуживание с помощью следующей функции вызывается после того, как пользователь нажимает на кнопке загрузки:

functions.generateWord = function() { 
    $http.post('/api/v1/surveys/genword', data.currentSurvey).success(function (response) { 
     var element = angular.element('<a/>'); 
     element.attr({ 
      href: 'data:attachment;charset=utf-8;application/vnd.openxmlformats-officedocument.wordprocessingml.document' + response, 
      target: '_blank', 
      download: 'test.docx' 
     })[0].click(); 
    }); 
}; 

На сервере, этот апи вызов получает пересылаемую следующий метод:

public Response exportToWord(Response response) { 
    try { 
     File file = new File("src/main/resources/template.docx"); 
     FileInputStream inputStream = new FileInputStream(file); 
     byte byteStream[] = new byte[(int)file.length()]; 
     inputStream.read(byteStream); 

     response.raw().setContentType("data:attachment;chatset=utf-8;application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 
     response.raw().setContentLength((int) file.length()); 

     response.raw().getOutputStream().write(byteStream); 
     response.raw().getOutputStream().flush(); 
     response.raw().getOutputStream().close(); 
     return response; 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Я попытался решить эту проблему по-разному, и я всегда в конечном итоге с поврежденным «test.docx», который выглядит следующим образом:

corrupted word file

ответ

3

Решил его использовать blobs и указать тип ответа как «arraybuffer» в вызове api $ http.post. Единственное плохое с этим решением (насколько я знаю) заключается в том, что он не очень хорошо работает с IE, но это проблема еще на один день.

functions.generateWord = function() { 
    $http.post('/api/v1/surveys/genword', data.currentSurvey, {responseType: 'arraybuffer'}) 
     .success(function (response) { 
      var blob = new Blob([response], {type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'}); 
      var url = (window.URL || window.webkitURL).createObjectURL(blob); 
      var element = angular.element('<a/>'); 
      element.attr({ 
       href: url, 
       target: '_blank', 
       download: 'survey.docx' 
      })[0].click(); 
     }); 
}; 

Я думаю, что пошло не так, что поток байтов был закодирован в виде простого текста, когда я попытался создать URL с:

href: 'data:attachment;charset=utf-8;application/vnd.openxmlformats-officedocument.wordprocessingml.document' + response 

тем самым развращает его.

При использовании blobs вместо этого я получаю «прямую» ссылку на сгенерированный поток байтов, и на нем не выполняется кодировка, поскольку для типа ответа установлено значение «arraybuffer».

Обратите внимание, что это только мои собственные аргументы в пользу того, почему что-то пошло не так с исходным кодом. Возможно, я ошибаюсь, поэтому не стесняйтесь меня исправить, если это так.