2016-02-24 3 views
0

Я хочу, чтобы пользователь загружал новый файл шаблона каждый раз, когда он входил в систему, поэтому я думаю о настройке определяемого пользователем атрибута для файла, который он будет хранить в сеансе, и отображать сообщение об ошибке, если он попытается для загрузки этого файла в любой последующий сеанс.InputStream не сохраняет атрибуты UserDefinedFileAttributeView

Для атрибута, определяемого пользователем, я беру временную метку. Но он теряет атрибуты, как только я конвертирую файл во входной поток, для загрузки пользователем.

EDIT: Я ожидаю, что файл, который пользователь получит, а затем загрузит обратно в том же сеансе, чтобы сохранить временную метку, которую я сохранил в пользовательском атрибуте «user.timestamp». Но файл, который доходит до пользователя, не имеет никакого специального атрибута.

 File templateFile = new File(context.getRealPath("resources") + "/downloads/template.xlsx"); 
     Path filePath = Paths.get(templateFile.getAbsolutePath()); 

     UserDefinedFileAttributeView view = Files 
       .getFileAttributeView(filePath, UserDefinedFileAttributeView.class); 

     view.write("user.timestamp", 
        Charset.defaultCharset().encode(timestamp.toString())); 



     InputStream fileStream = new FileInputStream(templateFile); 
     response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
     response.setHeader("Content-Disposition", "attachment; filename=Template.xlsx"); 
     IOUtils.copy(fileStream, response.getOutputStream()); 
     response.flushBuffer(); 
+0

Я не уверен, что вы имеете в виду, но «он теряет атрибут ...». Не могли бы вы изменить свой вопрос и добавить описание: 1. то, что вы ожидаете, 2. что на самом деле происходит. –

ответ

0

Вы на самом деле копирование содержания из файла шаблона в ответ сервлета. Точно как javadoc говорит:

Копии байтов из InputStream к OutputStream.

Ваш код работает, так что вы не копирование файла, только его содержание.

На самом деле в ответе сервлета вы не отправляете файл , вы отправляете поток байтов, который затем интерпретируется вашим браузером как файл Excel. Content-Disposition - всего лишь трюк для вашего браузера, читайте, например. это: https://support.microsoft.com/en-us/kb/260519

Когда Internet Explorer получает этот заголовок, он отображает диалоговое окно Загрузка файла, имя файла поле автоматически заполняется именем файла, указанного в заголовке.

файл на жестком диске, затем создается «с нуля» вашим браузером.

Идея «просто переносить файл as is» противоречива - метаданные файла имеют разный формат и структуру на основе каждой операционной системы.

Кстати, то, что вы делаете, не является потокобезопасным. Вы устанавливаете глобальные свойства файла для одного пользователя - что, если другой пользователь создает еще одну сессию тем временем?

Вы можете использовать файлы cookie для хранения этой информации в браузере пользователя, тогда каждый последующий запрос отправит вам файл cookie в качестве части каждого последующего запроса или вы должны решить на уровне бизнес-логики, который отсутствует сфера этого вопроса :) Для этого сформулируйте совершенно новый вопрос, основанный не на технологии, а на вашем случае использования. Что-то вроде: «Мне нужно это сделать, я уже пробовал это, и это не сработало, есть ли у него шаблон/алгоритм?»

+0

Да, я подозревал как таковой. Есть ли у нас альтернатива?Мне нужно убедиться, что пользовательские загрузки - это тот же самый файл, который он загрузил в тот же сеанс? – Napstablook

Смежные вопросы