Загрузка и загрузка файлов - это общие проблемы, возникающие в веб -разработке. В последние несколько дней загрузка файлов использовалась в проекте. Я также делал несколько заметок разбросанными способами раньше. Сегодня я организую это. Загрузка файла требует дальнейшего тестирования, давайте сначала поговорим о загрузке файлов.
1. Процесс обработки загрузки файла
Процесс загрузки файла на самом деле очень ясен, то есть:
1. Найдите файлы на основе имени файла или пути файла. Конкретная стратегия в основном основана на ваших собственных потребностях. Короче говоря, требуется полный путь файлов, который может найти систему.
2. Получите поток ввода и получите входной поток из целевого файла.
3. Получите выходной поток и получите выходной поток от ответа.
4. Прочитайте файл из входного потока и выводит файл через выходной поток. Это настоящий процесс выполнения загрузки.
5. Выключите поток iO.
Это основной процесс, и есть некоторые необходимые настройки атрибута, такие как более важный тип ContentType файла настройки и т. Д.
2. Не разговаривайте больше, добавьте код
Я сделал это с Springmvc, но на самом деле то же самое верно для других вещей. В основном мне нужен объект httpservletresponse и действительный целевой файл.
1. Код стойки регистрации
/** Загрузите загруженный файл*/function DownloadFromUpload (fileName) {window.location.href = path + "/download? Dir = upload & filename =" + encodeuri (encodeuri (filename));}/** Нормальная загрузка*/function download (filename) {window.location.href = path + path + path + path + path + path + path + path. "/Скачать? Dir = Download & Filename ="+Encodeuri (Encodeuri (filename));}2. Код контроллера
/*** Файл Скачать (скачать с пути загрузки)** @param request* @param response* @throws ioexception*/ @responsbody @requestmapping (value = "/download") public void downloadfile (httpservletrequest, httpservletrespons "UTF-8");/** Ограничение только файлов в папках загрузки и загрузки может быть загружено*/String folderMAME = "; if (! StringUtils.isempty (model.getdir ()) && model.getdir (). Equals (" upload ")) {foldame =" upload "; {else {folderam request.getSession (). getServletContext (). getRealPath ("/")+ "/web-inf/"+ foldername+ "/"+ filename; fileTools.downloadfile (запрос, ответ, fileabsolutepath); log.warn ("userId:"+ (integer) (recement.getSession (). (request.getSession (). getattribute ("username")) + ", загруженный файл:" + fileabsolutepath);}Логика загрузки здесь заключается в том, что стойка регистрации должна запрашивать/загрузить/загрузить и дать параметры имени файла. Чтобы избежать китайского искаженного кода, когда имя файла переднего плана используется в качестве параметра, он использует js 'encodeuri (), чтобы изменить его в код Unicode, а затем декодирует его на китайский. Кроме того, из -за особого характера проекта файлы, которые я хочу загрузить здесь, могут быть в папках загрузки и загрузки, поэтому здесь есть часть логики суждения. Кроме того, я инкапсуляю как имя файла, так и запрошенное имя папки в FileModel.
3. Загрузить логику реализации.
Здесь нет услуг, но он напрямую реализуется с использованием статических методов.
/*** Укажите имя загрузки при загрузке файла** @param запрос* httpservlectrequest* @param response* httpservletresponse* @param filepath* Полный путь файла* @param filename* Укажите имя файла, когда клиент загружается* @throws yoexception. Строка FilePath, String FileName) Throws IOException {BufferedInputStream bis = null; BufferedOutputStream bos = null; bis = new BufferedInputStream (new FileInputStream (filePath)); bos = new BufferedOutputStream (response.getOutputeam ()); long fileguen File (filePath) .length (); outs.setcharacterencoding ("utf-8"); outsect.setContentType ("Multipart/Form-Data");/** Решение китайской искаженной задачи каждого браузера*/String useragent = request.getheader ("user-agent"); fileName.getBytes (): filename.getbytes ("utf-8"); // fileName.getBytes ("UTF-8") обрабатывает проблемы с скважины кода в Safari FileName = New String (Bytes ", ISO-8859-1"); // Все браузеры в основном поддерживают реакцию кодирования ISO.Setheader («Содержимое-дипертиза», string.format («Приложение; filename =/"%s/"", filename); response.setheader ("dlength-juind”, string.valueof (filelgene)); byte [] buff = new byte [2048]; int bytesread; bis.read(buff, 0, buff.length))) {bos.write(buff, 0, bytesRead);}bis.close();bos.close();}/*** The download file name is not specified when downloading the file* * @param request* HttpServletRequest* @param response* HttpServletResponse* @param filePath* Full path of the file* @throws IoException*/public static void downloadfile (httpservlectrequest, httpservletresponse response, string filepath) throws ioexception {file file = new File (filePath); downloadfile (запрос, ответ, filepath, file.getname ());};Вот перегруженный метод загрузки для решения необходимости иногда указать имя файла, загруженное клиентом.
3. Что следует отметить
1. О выборе типа MIME
Я раньше не знал о типах MIME, но я обнаружил, что в Интернете много загруженных исходных кодов, которые имеют разные настройки. Это предложение
response.setContentType ("Multipart/Form-Data");Я проверил, что одна из функций установки типа MIME здесь - сообщить клиентскому браузеру обработать файл, который будет загружен в каком формате. Есть много объяснений на конкретном соответствующем веб -сайте. Если этот тип класса I установлен в этом формате, формат, как правило, будет автоматически сопоставлен.
2. Укажите имя файла загрузки клиента
Иногда нам может потребоваться указать имя файла, когда клиент загружает файл, то есть этот код
response.setheader ("content-disposition", string.format ("Attachment; filename =/"%s/"", имя файла));
Имя файла в нем может быть настроено. Передняя часть не должна перемещаться.
3. Решите проблему искаженного китайца
Это слишком часто, чтобы китайские файлы были искажены. Когда архитектура системы проекта впервые построена, все китайские кодировки должны быть объединены, в том числе в редакторе, странице и базе данных. Рекомендуется кодировка UTF-8. Если вы используете Spring, вы также можете настроить фильтр набора символов Spring, чтобы еще больше избежать искаженного кода Китая.
(1) Имя файла процесса запроса загрузки клиента искаженно
Иногда мы сталкиваемся с этим. Когда на странице на стойке регистрации отображается список загрузки китайского имени файла, он нормально, но когда мы переходим на фон, мы обнаруживаем, что имя файла в запросе искажено. В настоящее время мы можем использовать упомянутый выше Encodeuri, чтобы решить проблему.
(2) Имя файла искажено, когда клиент загружается и выполняет
В реальных тестах было обнаружено, что когда другие браузеры могут выполнять, китайское имя файла в соответствии с IE может показаться искаженным. Я видел такой кусок кода онлайн. После тестирования это прекрасно решило проблему китайского искаженного в разных браузерах.
/** Решить китайскую искаженную задачу каждого браузера*/string userAgent = request.getheader ("пользователь-агент"); byte [] bytes = userAgent.contains ("msie")? fileName.getBytes (): filename.getbytes ("utf-8"); // fileName.getBytes ("UTF-8") обрабатывает искаженную проблему Safari Filename = новая строка (байты ", ISO-8859-1"); // Все браузеры в основном поддерживают ответ ISO-кодирования. SetheAder («Контент-дисспозиция», string.format ("ATTHAMENT; FILENAME =/"%s/"", filename));(3) Файл искажен на сервере
Различные серверы также могут отличаться в зависимости от платформы, поэтому вам нужно обратить на нее внимание здесь. Для конкретных решений, пожалуйста, обратитесь к статье, которую я написал ранее: китайская искаженная обработка во время загрузки файлов.
Выше приведено, что файл файла веб -реализации Java и метод искаженной обработки, представленный вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!