La carga y descarga de archivos son problemas comunes encontrados en el desarrollo web. En los últimos días, la descarga de archivos se ha utilizado en un proyecto. También he tomado algunas notas de manera dispersa antes. Hoy lo organizaré. La carga de archivos necesita más pruebas, hablemos primero sobre la descarga de archivos.
1. Proceso de procesamiento de descarga de archivos
El proceso de descarga de archivos es realmente muy claro, es decir:
1. Localizar archivos basados en el nombre del archivo o la ruta del archivo. La estrategia específica se basa principalmente en sus propias necesidades. En resumen, se requiere la ruta completa de los archivos que el sistema puede encontrar.
2. Obtenga la secuencia de entrada y obtenga el flujo de entrada del archivo de destino.
3. Obtenga el flujo de salida y obtenga la secuencia de salida de la respuesta.
4. Lea el archivo de la secuencia de entrada y emite el archivo a través de la transmisión de salida. Este es el proceso de ejecución de descarga real.
5. Apague la transmisión IO.
Este es el proceso principal, y hay algunas configuraciones de atributos necesarias, como el tipo de contenido más importante del archivo de configuración, etc.
2. No hables más, agregue el código
Lo hice con SpringMVC, pero de hecho, lo mismo es cierto para otras cosas. Principalmente necesito objeto HttpServletResponse y un archivo de destino válido.
1. Código de recepción
/** Descargue el archivo cargado*/function downloadFromupload (nombre de archivo) {window.location.href = path + "/descargar? Dir = upload & filename =" + encodeuri (codeDuri (filename));}/** descarga normal*/descarga de funciones (filenameame) {window.location.href = pATH + "/descargar? dir = download & filename ="+encodeuri (encodeuri (nombre de archivo));}2. Código del controlador
/*** Descargar archivos (descargar desde la ruta de carga)** @param request* @param Respuesta* @throws ioexception*/ @respuestaBody @requestMapping (valor = "/descargar") public void downloadfile (httpservletRequest request, httpservletResponse respuesta, modelo de fileModel) lanza excepción {string filename = urlDecoder.decode (modelo (modelo (modelo (), modelo ((), (), logro. "UTF-8");/** Restringir los archivos solo en las carpetas de carga y descarga se pueden descargar*/String FolderName = "Descargar"; if (! StringUtils.isEmpty (model.getDir ()) && model.getDir (). Equals ("upload") {flowerNAM request.getSession (). (request.getSession (). getAttribute ("UserName")) + ", archivo descargado:" + FileAbsolutePath);}La lógica de descarga aquí es que la recepción solo necesita solicitar/descargar y dar los parámetros del nombre del archivo. Para evitar el código de confusión chino, cuando el nombre del archivo de primer plano se usa como parámetro, utiliza JS 'ENCODEURI () para cambiarlo al código Unicode, y luego decodifica a chino. Además, debido a la naturaleza especial del proyecto, los archivos que quiero descargar aquí pueden estar en las carpetas de carga y descarga, por lo que hay una parte de la lógica del juicio aquí. Además, encapsula tanto el nombre del archivo como el nombre de la carpeta solicitado en FileModel.
3. Descargar implementación lógica.
Aquí no hay servicio, pero se implementa directamente utilizando métodos estáticos.
/*** Especifique el nombre de descarga al descargar el archivo** @param solicitud* httpservletRequest* @param respuesta* httpServletResponse* @param filepath* ruta completa del archivo* @param fileName* especificar el nombre del archivo se muestra cuando el cliente descarga* @throws ioException*/public estatic boid descargar (httpServletRequest Solicitud, htTtletRettROWS IOEXCEPTCION String FilePath, String FileName) lanza IOException {BufferedInputStream bis = null; bufferedOutputStream bos = null; bis = new BufferedInputStream (new FileInputStream (FilePath)); Bos = New BufferDoutStream (Respuesta.getOutputStream ()); Long FilElding = new New Archivo (filePath) .length (); respuesta.setcharacterEncoding ("UTF-8"); Response.SetContentType ("multipart/formy-data");/** Resuelve el problema chino confuso de cada navegador*/String UserAgent = request.getheader ("User-Agent"); byte [] bytes = useragent.contains ("" "" msie ")? FileName.getBytes (): FileName.getBytes ("UTF-8"); // FileName.getBytes ("UTF-8") maneja problemas de código revuelto en Safari FileName = new String (bytes, "ISO-8859-1"); // Todos los navegadores básicamente admiten ISO que codifica la respuesta. bis.read (buff, 0, buff.length))) {bos.write (buff, 0, bytesread);} bis.close (); bos.close ();}/*** El nombre del archivo de descarga no se especifica al descargar el archivo** @param request* httpServletRequest* @param respuesta* httpServletResponse* @param filePath* IoException*/public static void downloadfile (httpservletRequest solicitud, respuesta httpservletResponse, string filepath) lanza ioexception {archivo archivo = nuevo archivo (filepath); descargarfile (solicitud, respuesta, filepath, file.getName ());}Aquí hay un método de descarga sobrecargado para resolver la necesidad de especificar el nombre del archivo descargado por el cliente.
3. cosas a tener en cuenta
1. Acerca de la elección del tipo mime
No sabía mucho sobre los tipos de MIME antes, pero descubrí que hay muchos códigos fuente descargados en Internet que tienen diferentes configuraciones. Esa es esta oración
respuesta.setContentType ("multipart/form-data");Verifiqué que una de las funciones de configurar el tipo MIME aquí es decirle al navegador del cliente que procese el archivo que se descargue en qué formato. Hay muchas explicaciones en el sitio web específico correspondiente. Si este tipo de clase I se establece en este formato, el formato generalmente coincidirá automáticamente.
2. Especifique el nombre del archivo de descarga del cliente
A veces es posible que necesitemos especificar el nombre del archivo cuando el cliente descarga el archivo, es decir, este código
Respuesta.Setheader ("Content-Disposition", String.Format ("adjunto; filename =/"%s/"", nombre de archivo));
El nombre de archivo en él se puede personalizar. La parte delantera no debe moverse.
3. Resuelve el problema de los chinos confusos
Es demasiado común que los archivos chinos se confundan. Cuando la arquitectura del sistema del proyecto se construye por primera vez, todas las codificaciones chinas deben estar unificadas, incluso en el editor, la página y la base de datos. Se recomienda la codificación UTF-8. Si está utilizando Spring, también puede configurar el filtro de ajuste de caracteres de Spring para evitar aún más el código de confusión chino.
(1) El nombre del archivo del proceso de solicitud de descarga del cliente está confuso
A veces lo encontramos. Cuando la página de recepción muestra la lista de descarga del nombre del archivo chino, es normal, pero cuando vamos al fondo, encontramos que el nombre del archivo en la solicitud está confuso. En este momento, podemos usar el encodeuri mencionado anteriormente para resolver el problema.
(2) Nombre de archivo confusión cuando el cliente descarga y se ejecuta
En las pruebas reales, se descubrió que cuando otros navegadores pueden ejecutar, el nombre del archivo chino bajo IE puede aparecer confuso. Vi tal código en línea. Después de la prueba, resolvió perfectamente el problema de los chinos confusos en diferentes navegadores.
/** Resuelve el problema chino de cada navegador*/string userAgent = request.getheader ("user-agent"); byte [] bytes = useragent.contains ("msie")? FileName.getBytes (): FileName.getBytes ("UTF-8"); // FileName.getBytes ("UTF-8") maneja el problema confuso de Safari FileName = new String (bytes, "ISO-8859-1"); // Todos los navegadores básicamente admiten la respuesta de codificación ISO.(3) Archivo confuso en el servidor
Diferentes servidores también pueden ser diferentes según la plataforma, por lo que debe prestarle atención aquí. Para soluciones específicas, consulte un artículo que escribí antes: Procesamiento confuso chino durante la descarga de archivos.
Lo anterior es el método de descarga de archivos de implementación web de Java y de procesamiento de confuso introducido por el editor. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!