在servlet 中使用 request.getSession().getServletContext().getRealPath("upload/" ); 获取不到 tomcat 服务器目录

        今天恰好有个上传文件的练习需要使用 request.getSession().getServletContext().getRealPath("upload/" ); 获取上传到服务器上的文件路径 C:\\apache-tomcat-7.0.47\\webapps\\CommonhelloWorldServlet \\upload 的目录,结果获取到的是 D:\eclipseWorkSpace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\CommonhelloWorldServlet ,并不是运行时的工程存放目录,得到的反而是工作空间的项目存放路径,我觉得应该是配置的问题,经过百度之后,果然得出猜想没错,步骤如下:

1、先在编辑器界面将现有 servlet 删除,再双击旋转 tomcat 7.0 版本新建 servlet,结果如下图:


发现配置如下图,解释了为啥获取到工作空间的路径了:


修改如下:


运行代码,效果如下,正常了:



使用`MultipartFile.transferTo`方法上传文件时,服务器文件名乱码问题通常是由于字符编码不一致导致的。以下是一些可能的解决方案: ### 1. 对文件名进行编码转换 在获取文件名后,对其进行编码转换。可以使用`URLEncoder`或`new String`的方式进行编码转换。例如,在引用[1]中获取文件名后进行如下处理: ```java import java.io.File; import java.io.IOException; import java.net.URLEncoder; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @RestController public class FileUploadController { @RequestMapping("/fileUpload2") public String upload2(MultipartFile file, HttpServletRequest request) throws IOException { // 创建文件夹,存放上传文件 String realPath = request.getSession().getServletContext().getRealPath("/upload"); File dir = new File(realPath); if (!dir.exists()) { dir.mkdirs(); } // 1.拿到上传的文件名 String filename = file.getOriginalFilename(); // 对文件名进行编码转换,防止乱码 filename = URLEncoder.encode(filename, "UTF-8"); filename = UUID.randomUUID() + "_" + filename; // 2.创建空文件 File newFile = new File(dir, filename); // 3.将数据写入空文件中 file.transferTo(newFile); return "index"; } } ``` ### 2. 设置请求编码 在`web.xml`或者使用Java配置设置请求的编码为`UTF-8`,确保请求参数(包括文件名)以正确的编码传递。 在`web.xml`中添加以下配置: ```xml <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 如果是Spring Boot项目,可以通过Java配置实现: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.CharacterEncodingFilter; @Configuration public class EncodingConfig { @Bean public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); filter.setForceEncoding(true); return filter; } } ``` ### 3. 检查服务器配置 确保服务器(如Tomcat)的配置文件`server.xml`中`Connector`元素的`URIEncoding`属性设置为`UTF-8`: ```xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值