很实用的小功能,通过配置Web.xml让点击文件路径的超链接,直接下载而不会在浏览器上尝试打开...

本文介绍如何在Web.xml中配置特定文件类型的MIME映射,以实现浏览器直接下载这些文件的功能,包括.xls、.rar和.doc等格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接在Web.xml文件中加入以下配置 

    <mime-mapping>
     <extension>xls</extension>
     <mime-type>application/octet-stream</mime-type>
    </mime-mapping>
    <mime-mapping>    
        <extension>rar</extension>    
        <mime-type>application/octet-stream</mime-type>    
    </mime-mapping>  
    <mime-mapping>    
        <extension>doc</extension>    
        <mime-type>application/octet-stream</mime-type>    
    </mime-mapping>    

这3个配置表示以.xls .rar和.dco结尾的文件价(Excel文件,压缩文件和Word文档)。

如果要对其他格式的文件实现同样的功能,再加入类似的配置就行了。

 

<think>好的,我现在需要帮助用户实现一个基于JSP的Web系统,具备文件上传、下载、列表显示和查看内容的功能。用户还指定了目录结构,需要在webapps下创建test3作为Web服务目录,并创建三个JSP页面:upfile.jsp、listdir.jsp和downfile.jsp。每个页面都有特定的功能,顶部还需要有导航链接。 首先,我得考虑每个页面的功能需求。对于文件上传,upfile.jsp需要使用表单,并设置enctype为multipart/form-data,这样才能上传文件。处理上传的文件可能需要使用Apache Commons FileUpload库,所以需要确保用户将相关的jar包(如commons-fileupload和commons-io)放在WEB-INF/lib目录下。上传成功后,文件应保存到服务器的指定目录,比如Web应用根目录下的upload文件夹。 接下来是listdir.jsp,需要列出Web应用目录下的所有文件和子目录。这里可以使用Java的File类来遍历目录,并生成超链接。当用户点击文件名时,如果是文本文件,可以显示其内容;如果是其他类型,可能需要提示无法预览。需要注意处理文件路径,确保正确读取文件内容,并处理异常情况,比如文件不存在或读取错误。对于downfile.jsp,需要动态生成可下载文件列表。同样使用File类遍历目录,生成下载链接。每个链接指向一个Servlet或JSP来处理文件下载,设置正确的Content-Type和Content-Disposition头,让浏览器识别为下载。用户提到要改进下载功能,使其根据服务目录的变化自动更新,所以不能硬编码文件名,必须动态读取目录中的文件。 三个页面顶部的超链接需要互相跳转,所以每个页面都需要有指向其他页面的链接,比如<a href="upfile.jsp">上传</a>等。 然后考虑代码实现。上传页面需要表单,处理上传的代码需要解析multipart请求,保存文件,可能需要使用DiskFileItemFactory和ServletFileUpload类。处理上传时,要检查文件大小、类型,避免安全问题。保存文件后,可能需要重定向或显示成功信息。 列表页面需要遍历目录,生成文件列表。对于每个文件,如果是文本类型(如.txt、.java、.jsp等),点击时可以传递文件名参数到同一页面,然后读取文件内容显示。要注意文件路径的正确性,使用application.getRealPath()来获取真实路径,避免路径错误。 下载页面需要遍历目录生成下载链接,每个链接指向一个下载处理的Servlet或JSP。例如,链接可以是downfile.jsp?filename=xxx,然后在downfile.jsp中设置响应头,读取文件并输出到响应流中。需要处理文件名编码,特别是含有特殊字符的情况,使用URLEncoder进行编码。 还需要注意Web应用的部署结构,确保upload目录存在,否则需要在上传时创建。另外,处理文件读写时要注意异常处理,比如IOException,以及安全限制,如文件大小限制、防止路径遍历攻击(检查文件名中是否包含../等)。可能的问题点包括:JSP中Java代码的嵌入是否符合最佳实践(通常建议使用Servlet和JSP结合,但用户可能只需要JSP实现),文件上传库的正确使用,路径处理是否正确,以及中文文件名乱码问题。需要设置request.setCharacterEncoding("UTF-8")和response.setContentType等解决编码问题。 现在,针对每个页面编写代码: 在upfile.jsp中,表单提交到自身,处理上传的逻辑需要放在JSP的<% ...%>中。检查是否是多部分请求,然后解析文件项,保存到upload目录。需要处理上传目录的创建,如果不存在的话。 在listdir.jsp中,获取文件列表,并显示。当有filename参数时,读取该文件内容。注意区分目录和文件,但用户需求可能只需要文件。需要检查文件扩展名决定是否显示内容。 在downfile.jsp中,同样遍历upload目录中的文件,生成下载链接。点击链接时触发下载,这需要设置响应头,例如Content-Disposition:attachment; filename="..."。 测试时,需要确保所有依赖库正确,upload目录有写入权限,以及各页面之间的导航正常。 最后,用户可能没有提到权限管理和安全性,所以在实际应用中需要考虑限制上传文件类型、大小,防止恶意文件上传,但根据题目要求,可能不需要实现这些高级功能。</think>以下是基于JSP实现的文件管理系统解决方案: 1. 文件上传功能(upfile.jsp): ```jsp <%@ page import="java.io.*, org.apache.commons.fileupload.*, org.apache.commons.fileupload.disk.*, org.apache.commons.fileupload.servlet.*" %> <html> <head> <title>文件上传</title> </head> <body> <h2>文件上传系统</h2> <a href="upfile.jsp">上传文件</a> | <a href="listdir.jsp">文件列表</a> | <a href="downfile.jsp">文件下载</a> <hr> <%-- 文件上传处理 --%> <% if(ServletFileUpload.isMultipartContent(request)){ DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); String savePath = application.getRealPath("/upload"); // 创建保存目录 File saveDir = new File(savePath); if(!saveDir.exists()) saveDir.mkdir(); for(FileItem item : upload.parseRequest(request)){ if(!item.isFormField()){ String fileName = new File(item.getName()).getName(); item.write(new File(savePath, fileName)); out.print("文件上传成功:" + fileName + "<br>"); } } } %> <%-- 上传表单 --%> <form method="post" enctype="multipart/form-data"> 选择文件:<input type="file" name="file"> <input type="submit" value="上传"> </form> </body> </html> ``` 2. 文件列表和查看功能(listdir.jsp): ```jsp <%@ page import="java.io.*" %> <html> <head> <title>文件列表</title> </head> <body> <h2>文件列表系统</h2> <a href="upfile.jsp">上传文件</a> | <a href="listdir.jsp">文件列表</a> | <a href="downfile.jsp">文件下载</a> <hr> <%-- 列出文件 --%> <% String dirPath = application.getRealPath("/upload"); File dir = new File(dirPath); for(File file : dir.listFiles()){ if(file.isFile()){ %> <a href="listdir.jsp?filename=<%= file.getName() %>"><%= file.getName() %></a><br> <% } } // 显示文件内容 String filename = request.getParameter("filename"); if(filename != null){ File f = new File(dir, filename); if(f.exists() && f.isFile()){ %> <h3><%= filename %> 内容:</h3> <pre><% BufferedReader reader = new BufferedReader(new FileReader(f)); String line; while((line = reader.readLine()) != null){ out.println(line); } reader.close(); %></pre> <% } } %> </body> </html> ``` 3. 文件下载功能(downfile.jsp): ```jsp <%@ page import="java.io.*" %> <html> <head> <title>文件下载</title> </head> <body> <h2>文件下载系统</h2> <a href="upfile.jsp">上传文件</a> | <a href="listdir.jsp">文件列表</a> | <a href="downfile.jsp">文件下载</a> <hr> <h3>可下载文件列表:</h3> <% String dirPath = application.getRealPath("/upload"); File dir = new File(dirPath); for(File file : dir.listFiles()){ if(file.isFile()){ %> <a href="download?filename=<%= file.getName() %>"><%= file.getName() %></a><br> <% } } %> </body> </html> ``` 4. 文件下载Servlet(需在WEB-INF/web.xml配置): ```java @WebServlet("/download") public class DownloadServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filename = request.getParameter("filename"); String path = getServletContext().getRealPath("/upload") + File.separator + filename; File file = new File(path); if(file.exists()){ response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(filename, "UTF-8") + "\""); try(InputStream in = new FileInputStream(file); OutputStream out = response.getOutputStream()) { byte[] buffer = new byte[4096]; int length; while((length = in.read(buffer)) > 0){ out.write(buffer, 0, length); } } } } } ``` 系统说明: 1. 需要创建以下目录结构: ``` webapps/ └── test3/ ├── WEB-INF/ │ ├── lib/ │ │ ├── commons-fileupload-1.4.jar │ │ └── commons-io-2.11.0.jar │ └── web.xml ├── upload/ # 文件存储目录 ├── upfile.jsp ├── listdir.jsp └── downfile.jsp ``` 2. 功能特点: - 文件上传使用Apache Commons FileUpload组件 - 自动创建upload存储目录 - 文件列表动态生成并支持内容预览 - 下载功能通过Servlet实现,支持中文文件名 - 各页面顶部有统一的导航链接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值