В примере этой статьи описывается, как реализовать функцию загрузки и скачивания файлов в struts2 в java. Поделитесь этим со всеми для справки. Конкретный анализ заключается в следующем:
1. Загрузка файла
Первый — это код страницы jsp.
Определите тег загрузки на странице jsp
Скопируйте код кода следующим образом:<tr>
<td align="right" bgcolor="#F5F8F9"><b>Приложение:</b></td>
<td bgcolor="#FFFFFF">
<input type="file" name="upload" />
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
Тогда связанные атрибуты, определенные в BaseAction, опускаются (вы также можете определить их в своем собственном действии, просто измените модификатор доступа).
Скопируйте код кода следующим образом:/**
*Базовый класс действия
**/
публичный класс BaseAction расширяет ActionSupport {
загрузка защищенного списка <File>;
protected List<String> uploadContentType //Тип файла;
protected List<String> uploadFileName //Имя файла;
защищенная строка savePath //сохраняем путь;
}
Затем в Action есть метод загрузки, код следующий:
Скопируйте код кода следующим образом:/**
* 8. Загрузка вложений * @param upload
*/
public void uploadAccess(List<File> upload){
пытаться {
если (ноль != загрузить) {
for (int i = 0; i <upload.size(); i++) {
Строковый путь = getSavePath() + ""+ getUploadFileName().get(i);
System.out.println(путь);
item.setAccessory(getUploadFileName().get(i));
FileOutputStream fos = новый FileOutputStream (путь);
FileInputStream fis = новый FileInputStream(getUpload().get(i));
буфер байт[] = новый байт[1024];
интервал лен = 0;
while ((len = fis.read(buffer)) > 0) {
fos.write(буфер, 0, длина);
}
фис.закрыть();
фос.закрыть();
}
}
} catch (Исключение е) {
logger.error("Ошибка загрузки вложения.", e);
}
}
Тогда код копирования моего файла struts2.xml будет выглядеть следующим образом: <action name="itemRDAction_*" метод="{1}">
<param name="savePath">e:upload</param>
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedTypes">
application/octet-stream,image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd. MS Excel
</парам>
<param name="fileUpload.maximumSize">8000000</param>
</перехватчик-ref>
<result name="show_item_rd_upd"> /WEB-INF/jsp/page_item/updItem_rd.jsp</result>
<result name="show_item_rd_list"> /WEB-INF/jsp/page_item/listItem_rd.jsp</result>
<result name="show_item_rd_push"> /WEB-INF/jsp/page_item/pushItem_rd.jsp</result>
</действие>
savePath — путь сохранения, fileUpload.allowedTypes используется для ограничения типа загружаемого файла. fileUpload.maximumSize — ограничение размера файла.
2.Загрузка файла
Сначала скопируйте код ссылки для скачивания на странице следующим образом: <tr>
<td align="right" bgcolor="#F5F8F9"><b>Приложение:</b></td>
<td bgcolor="#FFFFFF">
<div>${item.accessory</div>
<c:if test="${!пустой элемент.аксессуар}">
<div style="float: left;"><a style="color: black; text-decoration: none;" href="download.action?filename=${item.accessory}">Загрузить</a>< /дел>
</c:if>
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
Далее следует код DownloadAction:
Скопируйте код кода следующим образом:/**
* СкачатьДействие
*
* @author zhaoxz
*
*/
@Controller("downloadAction")
@Scope("прототип")
публичный класс DownloadAction расширяет BaseAction {
/**
*
*/
частный статический окончательный длинный сериалVersionUID = -4278687717124480968L;
частный статический регистратор Logger = Logger.getLogger(DownloadAction.class);
частное строковое имя файла;
частный InputStream inputStream;
частная строка savePath;
частная строка mimeType;
общественный InputStream getInputStream() {
пытаться {
String path = getSavePath() + "//"+ new String(filename.getBytes("ISO8859-1"), "utf-8");
System.out.println(путь);
mimeType = ServletActionContext.getServletContext().getMimeType(путь)+ ";кодировка=UTF-8";
inputStream = новый FileInputStream (путь);
Строковый агент = request.getHeader("USER-AGENT");
System.out.println(агент);
если (нуль != агент) {
if (-1 != Agent.indexOf("Firefox")) {// Firefox
mimeType = mimeType.replace("UTF-8", "ISO8859-1");
} еще {// IE7+ Chrome
System.out.println("IE,Chrome");
имя_файла = новая строка(filename.getBytes("ISO8859-1"),"utf-8");
имя файла = java.net.URLEncoder.encode(имя файла, "UTF-8");
}
}
} catch (Исключение е) {
logger.error("Ошибка загрузки информации о файле.", e);
}
если (нуль == inputStream) {
System.out.println("Ошибка getResource");
}
вернуть входной поток;
}
общественный недействительный setInputStream (InputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public String Execute() выдает исключение {
вернуть УСПЕХ;
}
/****************************** приготовьтесь ******************* ******* **********/
публичная строка getSavePath() {
вернуть этот.savePath;
}
public void setSavePath (String savePath) {
this.savePath = savePath;
}
публичная строка getFilename() {
вернуть имя файла;
}
public void setFilename (String filename) {
это.имя_файла = имя_файла;
}
}
Затем есть файл struts2.xml:
Скопируйте код следующим образом: <action name="download">
<param name="savePath">E:/upload</param>
<тип результата="поток">
<param name="contentType">${mimeType</param>
<param name="contentDisposition">attachment;filename="${filename}"</param>
<param name="inputName">inputStream</param>
</результат>
</действие>
При скачивании обращайте внимание на формат кодировки и проблем быть не должно.
Проблемы, возникшие при загрузке
1. Возникает ошибка при загрузке больших файлов. Решение 1.
Возникающие ошибки следующие:
1. 2012-02-24 11:06:31,937 ОШИБКА (org.apache.struts2.dispatcher.Dispatcher:512) - не удалось найти действие или результат.
Для действия com.iman.portal.action.QuestionActionImpl не определен результат и проблема с результатом. Страница действия - файл:/E:/myeclipse/workspaces/portal/WebRoot/WEB-INF/classes/struts2/struts-question.xml:51: 55
2. запрос отклонен, так как его размер (2973652) превышает настроенный максимум (2097152)
Китайское значение: запрос отклонен, поскольку его размер (2973652) превышает настроенный максимум (2097152).
Учитывая пользовательский опыт, необходимо перехватывать подобные исключения при загрузке вложений. Решение следующее:
1. Загруженные файлы в процессе загрузки сначала сохраняются в кеше. В целях безопасности добавьте путь временного хранения к файлу struts.properties, хотя в проекте задан физический путь к серверу.
Скопируйте код следующим образом: struts.multipart.saveDir=/temp
2. Учитывая, что размер загружаемого файла может быть изменен позже, независимо от того, является ли он значением по умолчанию или нет, добавьте следующую конфигурацию в файл struts.properties проекта:
Скопируйте код следующим образом: <!-- Разрешенный размер загружаемого файла — 2M -->
<constant name="struts.multipart.maxSize" value="2097152"/>
3. Конфигурация struts.xml
Скопируйте код следующим образом: <!-- Как изменить проблему -->
<action name="updateProblem" метод="updateProblem">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="defaultStack" />
<result name="input">/page/question/page/problemPage.jsp</result>
</действие>
4. Самый важный и ответственный шаг
Перехватчик fileUpload определяет тип и размер файла только после его загрузки на сервер. Если мы ничего не делаем в действии, исключение будет отображаться перед пользователем, поэтому я подумал о том, как установить информацию об исключении в виде сообщения об ошибке уровня действия. То есть переопределить метод addActionError.
Скопируйте код кода следующим образом: @Override
public void addActionError(String anErrorMessage) {
// Здесь нам нужно сначала определить, является ли это ошибкой, которую мы хотим заменить, прежде чем обрабатывать ее.
if (anErrorMessage.startsWith("запрос отклонен из-за его размера")) {
Шаблон шаблона = Pattern.compile("d+");
Сопоставитель m = шаблон.Сопоставитель(anErrorMessage);
// Сопоставить один раз
м.найти();
String s1 =m.group();//Размер загружаемого файла
// Повторное совпадение
м.найти();
String s2 =m.group();//ограниченный размер
if(!s1.equals("") && !s2.equals("")){
fileUploadErrorMessage="Размер загруженного вами файла (" + Long.valueOf(s1)/1024 + "байт) превышает разрешенный размер (" + Long.valueOf(s2)/1024/1024 + "M)";
getRequest().setAttribute("fileUploadErrorMessage","Файл слишком велик и превышает допустимый размер ("+Long.valueOf(s2)/1024/1024+"M. Не удалось загрузить!");
// Заменяем информацию
super.addActionError(fileUploadErrorMessage);
}
} else {// В противном случае обработайте его в соответствии с исходным методом
super.addActionError(anErrorMessage);
}
}
Да, используйте <s:fielderror/> <s:fielderror/> на возвратной странице, чтобы получить содержимое ошибки в addActionError.
Поскольку я не хочу отображать причину ошибки на странице и хочу, чтобы появилось всплывающее окно с подсказкой, я помещаю информацию в объект запроса.
При загрузке страницы добавляется следующая js-проверка:
Скопируйте код кода следующим образом: // Определяем, успешно ли загружен файл
var message="${request.fileUploadErrorMessage}";
if(message!=null && ""!=trim(message) && message!="null"){
self.parent.diag.close();
предупреждение (сообщение);
возвращаться;
}
Вот несколько ссылок, чтобы понять Dongdong:
struts.multipart.maxSize контролирует максимальный размер файлов, загружаемых всем проектом.
Атрибуты MaximumSize перехватчиков struts.multipart.maxSize и fileUpload имеют различное разделение труда, которое суммировано следующим образом:
1.struts.multipart.maxSize контролирует максимальный размер загружаемых файлов во всем проекте.
Если этот размер будет превышен, в фоновом режиме будет сообщено об ошибке, и программа не сможет обработать такой большой файл. В поле error появится следующее приглашение:
запрос отклонен, так как его размер (16272982) превышает настроенный максимум (9000000)
2. Атрибут MaximumSize перехватчика fileUpload должен быть меньше значения struts.multipart.maxSize.
Значение struts.multipart.maxSize по умолчанию — 2M. Если maxSize больше 2M, значение struts.multipart.maxSize должно быть установлено больше, чем MaximumSize.
3. Если размер загруженного файла превышает struts.multipart.maxSize, система сообщает об ошибке. Если размер загруженного файла находится между struts.multipart.maxSize и maxSize, система предложит:
Файл слишком большой: файл «MSF Concept.ppt» «upload__5133e516_129ce85285f__7ffa_00000005.tmp» 6007104
Если размер загруженного файла меньше максимального размера, загрузка прошла успешно.
Скопируйте код следующим образом: <action name="UploadFile">
<result name="UploadFileResult">/pages/ShowOtherFiles.jsp</result>
<result name="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/data</param>
<param name="maximumSize">52428800</param>
</перехватчик-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</действие>
Возникает ошибка при загрузке больших файлов. Решение 2.
Проблема: Ошибка при загрузке больших файлов...
Решение. Измените параметры в файле struts.xml следующим образом. Скопируйте код следующим образом: <constant name="struts.multipart.maxSize" value="55000000"/>.
<имя действия="ЗагрузитьФайл">
<result name="UploadFileResult">/www.VeVB.COm/ ShowOtherFiles.jsp</result>
<result name="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/data</param>
<param name="maximumSize">52428800</param>
</перехватчик-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</действие>
Соотношение между размером файла struts.xml и фактическим размером файла: 1048576 (байт) = 1024*1024 = фактический размер файла 1 МБ.
struts.multipart.maxSize контролирует максимальный размер файлов, загружаемых всем проектом.
Атрибуты MaximumSize перехватчиков struts.multipart.maxSize и fileUpload имеют различное разделение труда, которое суммировано следующим образом:
1.struts.multipart.maxSize управляет максимальным размером загружаемых файлов во всем проекте. Если этот размер будет превышен, в фоновом режиме будет сообщено об ошибке, и программа не сможет обработать такой большой файл. В поле error появится следующее приглашение:
запрос отклонен, так как его размер (16272982) превышает настроенный максимум (9000000)
2. Атрибут MaximumSize перехватчика fileUpload должен быть меньше значения struts.multipart.maxSize.
Значение struts.multipart.maxSize по умолчанию — 2M. Если maxSize больше 2M, значение struts.multipart.maxSize должно быть установлено больше, чем MaximumSize.
3. Если размер загруженного файла превышает struts.multipart.maxSize, система сообщает об ошибке. Если размер загруженного файла находится между struts.multipart.maxSize и maxSize, система предложит:
Файл слишком большой: файл «MSF Concept.ppt» «upload__5133e516_129ce85285f__7ffa_00000005.tmp» 6007104
Если загруженный файл меньше максимального размера, загрузка прошла успешно.
Ограничения на типы файлов для загрузки
Настройка перехватчика загрузки файлов
Стек по умолчанию в struts2 уже содержит перехватчик загрузки файлов. Если вы хотите добавить параметр разрешенных типов, вам нужно написать новый стек по умолчанию, скопировать его и изменить:
Скопируйте код следующим образом: <перехватчики>
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="исключение"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<имя ссылки-перехватчика=www.VeVB.COm/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="профилирование"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload">
<param name="allowedTypes">
изображение/png, изображение/gif, изображение/jpeg
</парам>
</перехватчик-ref>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo..*,^struts..*</param>
</перехватчик-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">ввод,назад,отмена,обзор</param>
</перехватчик-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">ввод,назад,отмена,обзор</param>
</перехватчик-ref>
</перехватчик-стек>
</перехватчики>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
Изменяйте скопированный код в коде только следующим образом: <interceptor-ref name="fileUpload">
<param name="allowedTypes">
изображение/png, изображение/gif, изображение/jpeg
</парам>
</перехватчик-ref>
Стек перехватчиков настраивается внутри тега <package> и вне тега <action>, как указано выше. Если мы определим его как перехватчик по умолчанию, нам не нужно этого делать.
Добавьте его в тег <action>. Если нет, вам нужно добавить перехватчик. Код выглядит следующим образом: <action>.
<result name="input">/error/dbError.jsp</result>
<interceptor-ref name="myDefaultStack"></interceptor-ref>
</действие>
Действие «Ошибка типа загрузки файла» будет напрямую возвращать входные данные, поэтому нет необходимости возвращать «входные данные» в действии;
Вы также можете определить путь и размер вашего запроса на загрузку вне тега <package>:
Скопируйте код следующим образом: <constant name="struts.multipart.saveDir" value="/upload/detailed"></constant>
<constant name="struts.multipart.maxSize" value="1024"></constant>
Самый важный момент: в форме для загрузки файлов необходимо добавить: enctype="multipart/form-data". В противном случае будет выдано сообщение об ошибке ввода.
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.