Давайте сначала рассмотрим простейший пример загрузки файла:
Скопируйте код кода следующим образом:
пакет com.yyz.response;
импортировать java.io.FileInputStream;
импортировать java.io.IOException;
импортировать java.io.OutputStream;
импортировать javax.servlet.ServletException;
импортировать javax.servlet.http.HttpServlet;
импортировать javax.servlet.http.HttpServletRequest;
импортировать javax.servlet.http.HttpServletResponse;
//Загрузка файла
публичный класс ResponseDemo расширяет HttpServlet {
public void doGet (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
String Realpath = this.getServletContext().getRealPath("/download/1.gif");
Строковое имя файла = Realpath.substring(realpath.lastIndexOf("//")+1);
response.setHeader("content-disposition", "attachment;filename="+filename);
//Сервер использует этот заголовок, чтобы сообщить браузеру открыть данные в режиме загрузки
FileInputStream in = новый FileInputStream (realpath);
интервал лен = 0;
байтовый буфер[]=новый байт[1024];
OutputStream out = response.getOutputStream();
while((len = in.read(buffer))>0){
out.write(буфер, 0, длина);
}
в.закрыть();
//Закрывать нет необходимости. Когда ответ будет уничтожен, сервер автоматически закроет поток, связанный с ответом.
}
public void doPost (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
doGet (запрос, ответ);
}
}
Функция этого кода — загрузить картинку 1.png с сервера. Структура каталогов отображается следующим образом с помощью проводника пакетов MyEclipse:
Давайте немного усложним задачу. Файл, который мы хотим скачать, — это файл с китайским именем. Поскольку элементы в заголовочном файле протокола http могут быть только символами ASCII, описанный выше метод (непосредственно измените String Realpath = this.getServletContext().getRealPath("/download/1.gif"); на String Realpath = this . getServletContext().getRealPath("/download/picture.gif");) Получите файл напрямую,
Будут проблемы с искаженным кодом. Прилагаю результаты испытаний:
Чтобы решить эту проблему, используйте метод encode класса URLEncoder:
Скопируйте код кода следующим образом:
пакет com.yyz.response;
импортировать java.io.FileInputStream;
импортировать java.io.IOException;
импортировать java.io.OutputStream;
импортировать java.net.URLEncoder;
импортировать javax.servlet.ServletException;
импортировать javax.servlet.http.HttpServlet;
импортировать javax.servlet.http.HttpServletRequest;
импортировать javax.servlet.http.HttpServletResponse;
//При загрузке китайских файлов имена китайских файлов должны иметь URL-кодировку.
публичный класс ResponseDemo расширяет HttpServlet {
public void doGet (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
String Realpath = this.getServletContext().getRealPath("/download/picture.gif");
Строковое имя файла = realpath.substring(realpath.lastIndexOf("//")+1);
response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
//Эта функция кодирует строку в URL
FileInputStream in = новый FileInputStream (realpath);
интервал лен = 0;
байтовый буфер[]=новый байт[1024];
OutputStream out = response.getOutputStream();
while((len = in.read(buffer))>0){
out.write(буфер, 0, длина);
}
в.закрыть();
}
public void doPost (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
doGet (запрос, ответ);
}
}
Прилагаю результаты испытаний:
Кроме того, есть небольшая деталь, на которую необходимо обратить внимание каждому:
FileReader нельзя использовать вместо FileInputStream. Данные будут потеряны при использовании FileReader. Причина в следующем: FileReader — это поток символов, а такие данные, как изображения и медиа-файлы, хранятся в формате 01. При чтении с помощью FileReader вам необходимо свериться с таблицей кодировки. кодировка не указана. Используется кодировка по умолчанию для соответствующей платформы. Например, компьютеры в Китае будут проверять GB2312. При считывании кода, которого нет в таблице кодов GB2312, данные будут закодированы в виде '? ', данные станут китайскими и '? 'Смешивание. После отправки клиенту еще раз проверьте таблицу кодов при ее отображении и замените все «?» на «?», и данные будут потеряны. Просто помните одну вещь об этой детали: потоки байтов могут обрабатывать любые типы данных, потоки символов могут обрабатывать только символьные данные.