Это были две основные причины для поврежденного файла.
finally
, чтобы убедиться, что соединение будет закрыто. Вот решение.
public String createZipfile(User user,MultipartFile[] uploadingFiles,String name,String category) throws Exception
{
List<String> srcFiles = new ArrayList<String>();
Date localDateTime = new Date();
System.out.println(localDateTime.toString().replaceAll(":", ""));
LocalTime time = LocalTime.now();
String filetime = (localDateTime.toString().replaceAll(":", ".")).replaceAll("IST ", ""); //time.toString().replaceAll(":", ".");
String finalFileName = category+"_"+name+"_"+user.getName()+"_"+filetime+".zip";
try
{
FileOutputStream fos = new FileOutputStream("F:\\FolderName\\FolderName\\Test\\"+finalFileName);
ZipOutputStream zipOut = new ZipOutputStream(fos);
try
{
int i=0;
for(MultipartFile uploadFile:uploadingFiles)
{
srcFiles.add(i, uploadingFiles[i].getOriginalFilename());
java.io.File convFile = new java.io.File(uploadingFiles[i].getOriginalFilename());
convFile.createNewFile();
byte[] b;
b = uploadingFiles[i].getBytes();
java.io.File fileToZip = new java.io.File(convFile.toString());
FileInputStream fis = new FileInputStream(fileToZip);
ZipEntry zipEntry = new ZipEntry(uploadingFiles[i].getOriginalFilename());
zipOut.putNextEntry(zipEntry);
byte[] bytes = uploadingFiles[i].getBytes();
zipOut.write(bytes, 0, uploadingFiles[i].getBytes().length);
fis.close();
zipOut.closeEntry();
i++;
}
}
catch (IOException e) {
e.printStackTrace();
throw new Exception("File Zipping Error");
}
finally {
zipOut.finish();
zipOut.flush();
zipOut.close();
fos.close();
}
}
catch (Exception e) {
throw new Exception("File Upload Error");
}
return finalFileName;
}
Как указал Дэн они распространяются вместе с Visual Studio.
Если у вас нет Visual Studio,
Это часть Microsoft Visual Studio (но не Express Edition .)
Я думаю, что вам нужно иметь копию Visual Studio 2005 или 2008 (не Express), чтобы получить ATL. Если у вас установлена одна из них, но у вас нет ATL, перейдите в «Панель управления: Установка и удаление программ» и выполните установку «Изменить» (с программным компакт-диском или DVD-дисководом в дисководе) и убедитесь, что флажок установлен. для ATL проверяется.
Что касается учебников :
Я не нашел действительно хорошего онлайн. При использовании ATL / COM есть несколько хороших страниц:
Я немного подзабыл с w / COM и ATL, но если я правильно помню, классы, которые вы вам захочется узнать, что вы будете использовать чаще всего (особенно если вы используете чужие COM-объекты, а не реализуете свои собственные) - CComBSTR, CComPtr и CComVariant. Кроме того, оператор #import в Visual C ++ значительно упрощает использование внешних объектов COM, он генерирует класс интеллектуальных указателей для вас из внешней DLL или EXE-файла.
Если вы собираетесь реализовывать объекты COM, Я настоятельно рекомендую получить копию ATL Internals (сейчас выходит более новая редакция, охватывающая ATL v8). Да, в некоторых разделах речь идет о мрачных подробностях, но даже в качестве вступительной книги она довольно хорошо написана.
Если вы никогда раньше не использовали COM, то «классические» книги Essential COM и Эффективные COM очень хороши, и вы, вероятно, можете получить их недорого из ваших любимых источников подержанных книг. Вам также захочется быть знакомым с идиомой RAII , если вы еще этого не сделали.
Группа новостей microsoft.public.vc.atl очень хороша задавать конкретные вопросы. (хотя, как правило, они более грубые, чем в StackOverflow)
Осторожно: с COM есть много маленьких ошибок, хотя ATL помогает ему стать намного легче и без большого количества раздувания. Техника «симулированного динамического связывания», известная как CRTP , полезна в мире C ++, не только в контексте ATL / COM, но особенно, если вы разрабатываете библиотеку классов многократного использования, которые вы хотите создать в подклассе или смешать в ситуации, когда одновременно присутствует только один экземпляр (например, класс CSpiffyFramework, который предоставляет смешанную функциональность, которую вы хотите многократно использовать, и у вас есть производный класс, который вы хотите включить эту функциональность, и он не является частью модели виртуальных объектов так что вам действительно не нужен vtable).
Удачи!