#java #http #servlets #file-upload #mime
#Ява #http #сервлеты #файл-загрузить #мим
Вопрос:
У меня есть Java-приложение, работающее под управлением Apache Tomcat 8.0.21.0 на сервере RHEL 7.8. Он принимает входные данные из браузера и загружает файл в другое приложение Java, работающее на удаленном сервере.
Частичный код является:
// FileItem "fileToUpload" is passed by a HTML input type "file" in a JSP page private void doPost (HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try { if (ServletFileUpload.isMultipartContent (request)) { FileItemFactory factory = new DiskFileItemFactory (); ServletFileUpload upload = new ServletFileUpload (factory); Listlt;FileItemgt; fileItems = upload.parseRequest (request); // findFileItem () and generateFileDetails () are local functions FileItem fileItemToUpload = findFileItem (fileItems, "fileToUpload"); String fileDetails = generateFileDetails (fileItemToUpload); MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create (); entityBuilder.setMode (HttpMultipartMode.BROWSER_COMPATIBLE); entityBuilder.addTextBody ("fileDetails", fileDetails); InputStream is = fileItemToUpload.getInputStream (); entityBuilder.addBinaryBody ("is", is); HttpEntity entity = entityBuilder.build (); // Exception thrown here String url = "[remote server URL]"; CloseableHttpClient httpClient = HttpClients.createDefault (); HttpPost httpPost = new HttpPost (url); httpPost.setEntity (entity); CloseableHttpResponse response = httpClient.execute (httpPost); . . . response.close (); httpClient.close (); } else { /* handle non-multipart POSTs */ } } catch (Exception e) { . . . } }
Довольно многословное Исключение:
java.lang.Ошибка ссылки: нарушение ограничений загрузчика: при разрешении метода «org.apache.http.entity.mime.MultipartEntityBuilder.build()Lorg/apache/http/HttpEntity;» загрузчик классов (экземпляр org/apache/catalina/загрузчик/WebappClassLoader) текущего класса, uri_test_main/HttpHdlr, и загрузчик классов (экземпляр java/net/URLClassLoader) для класса, определяющего метод, org/apache/http/entity/mime/MultipartEntityBuilder, имеют разные объекты класса для типа er.build()Lorg/apache/http/HttpEntity; используется в подписи
выбрасывается строка: «Сущность HttpEntity = EntityBuilder.build ();»
Примечание.Исключение является постоянным для всех продуктов браузера.
Есть ли быстрое или очевидное решение? У меня есть несколько доступных обходных путей, но я бы предпочел не использовать устаревший класс MultipartEntity.
Ответ №1:
Это приложение, разработанное в среде Eclipse IDE, настроенное как проект Maven. Внешняя БАНКА httpmime-4.5.6.jar необходимо добавить в путь сборки Java проекта и зависимость:
lt;dependencygt; lt;groupIdgt;org.apache.httpcomponentslt;/groupIdgt; lt;artifactIdgt;httpmimelt;/artifactIdgt; lt;versiongt;4.5.6lt;/versiongt; lt;/dependencygt;
необходимо добавить к зависимостям в pom.xml.