Связь между подписанным апплетом и контроллером на стороне сервера
Я создал подписанный апплет для загрузки файла на сервер. Код работает нормально, но я хочу отправить этот файл из апплета на серверный контроллер, где размещен код, чтобы сохранить этот файл на сервере.
Мой код SendFile в подписанном апплете:
public static void sendFile(String destFileName) throws IOException {
String filePrivacy = "Public";
String fileKeyword = "uploadFileDocumentName";
String fileComments = "fileComments";
String fileType = "txt";
String fileFolder = "/Works";
String fileDetails = "";
HttpClient client = new HttpClient();
PostMethod postMethod = new PostMethod(
"http://localhost:8080/fileUpload/encryptFileUpload.works?filePrivacy="+filePrivacy+"&fileKeyword="+fileKeyword+"&fileComments="+fileComments+"&fileType="+fileType+"&fileFolder="+fileFolder+"&fileDetails="+fileDetails);
File f = new File(destFileName);
Part[] parts = {new FilePart(f.getName(), f)};
postMethod.setRequestEntity(new MultipartRequestEntity(parts, postMethod.getParams()));
postMethod.setRequestHeader("Content-type", "text/xml; charset=ISO-8859-1");
client.executeMethod(postMethod);
postMethod.releaseConnection();
}
И метод My UploadController выглядит так:
@RequestMapping(value = "/encryptFileUpload.works")
public String uploadEncryptFile(String filePrivacy,
String fileKeyword,
String fileComments,
String fileType,
String fileFolder,
HttpServletRequest request, HttpServletResponse response) {
try {
Map<String, Object> requestMap = new HashMap<String, Object>();
requestMap.put(DMSConstants.JCR_FILE_PRIVACY, filePrivacy);
requestMap.put(DMSConstants.JCR_FILE_KEYWORD, fileKeyword);
requestMap.put(DMSConstants.JCR_FILE_COMMENTS, fileComments);
requestMap.put(DMSConstants.JCR_FILE_TYPE, fileType);
MultipartHttpServletRequest m = (MultipartHttpServletRequest) request;
MultipartFile file = m.getFile("Filedata");
Node folderNode = contentPublishService.getFolderNode(fileFolder);
Node node = contentPublishService.saveFileToRepository(folderNode,
file.getInputStream(), file.getOriginalFilename(),
requestMap);
} catch (RepositoryException e) {
e.printStackTrace();
return null;
}
на линии MultipartHttpServletRequest m = (MultipartHttpServletRequest) request;
Я получаю исключение, как:
java.lang.ClassCastException: org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest
at com.nmmc.works.web.controller.FileUploadController.uploadEncryptFile(FileUploadController.java:177)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
Так что, где происходит не так и какие изменения я должен сделать в моем коде. И второе, кто я могу получить файл на контроллере?
2 ответа
Нужно больше деталей...
Просто несколько предложений...
Что такое объект Part?
Если вы хотите загрузить файл "по частям", я могу порекомендовать просто переопределить метод writeTo MultipartEntity для загрузки большого файла вместо использования массивов, или, может быть, это не так?
Что касается броска... Я могу предположить, что линия может вызвать проблему
MultipartHttpServletRequest m = (MultipartHttpServletRequest) request;
Как правило, HttpClient работает в паре с FileUpload lib. Так почему бы не использовать его вместо этого?
И еще одна вещь... вы указываете содержание Mime как text/xml
но это xml, особенно если это часть файла bin? Не должно ли это быть какой-то application/octet-stream
вместо?
Во всяком случае, было бы более полезно, чтобы вы предоставили больше деталей в вашем вопросе
У меня есть решение этой проблемы. вот что я изменил в моем существующем коде
Мой подписанный апплет:
MultipartPostMethod mPost = new MultipartPostMethod(uri);
mPost.addParameter("Filedata", f.getName(), f);
client.executeMethod(mPost);
Теперь работает нормально.