FileUpload上传文件名异常(IE6)

自己的网站用fileupload控件上传文件的时候,开始以为是文件大小的限制,现在大小限制取消了可是还是有问题(在IE7+及FF下正常,IE6报错)


Debug了一下发现是IE6在执行:this.FileUpload_homework.PostedFile.FileName的时候由于安全性低会带上路径全称(如:c:\xxx\xx\test.txt)导致和saveas方法中的文件路径重复而报错!而在IE8,FF上由于安全性考虑将PostedFile.FileName的值自动去除了文件路径而成功。!


因此参考了如下文章将文件名进行了处理:


Path.GetFileName(FileUpload1.PostedFile.FileName);


从而正常执行。


原文如下:


Asp.net 文件上传的 FileUpload FileName 和 FileUpload PostedFile.FileName的细节问题

ASP.NET 文件上传估计大家都用得很熟悉,常用控件 FileUpload 。

主要步骤:

     1.判断是否合法

     2.获得文件的路径 (包括目录的完整路径,同时可能需要修改文件名)

     3.保存文件

如:

FileUpload1.SaveAs(Server.MapPath("upload") + "\\" + FileUpload1.FileName);


 

估计有初学者弄不清 FileUpload1.FileName 和 FileUpload1.PostedFile.FileName 区别

其实,FileUpload1.FileName 是获得上传的文件名,FileUpload1.PostedFile.FileName 获得上传的文件名包括其完整路径。

 

1Label1.Text = FileUpload1.FileName;
2Label2.Text = FileUpload1.PostedFile.FileName;

在FireFox中结果:

在IE6+的结果:

而在IE9中的结果和Firefox的一样

即 FileUpload1.PostedFile.FileName 获得的仅是上传文件的文件名。
修改下:

 

1Label1.Text = FileUpload1.FileName;
2Label2.Text = FileUpload1.PostedFile.FileName;
3Label3.Text = Path.GetFileName(FileUpload1.PostedFile.FileName);

Path.GetFileName(FileUpload1.PostedFile.FileName); 来获取文件名,

 

而 路径 就用这个 string strdr=Request.PhysicalApplicationPath+"\\";

这样在各浏览器下都能兼容了。



<think>好的,用户问的是如何在PrimeFaces的<p:fileUpload>组件中自定义文件名编码。我需要先回想一下之前的问题历史。之前用户问过如何在上传前获取文件名并写入Bean,现在他们可能遇到了中文文件名乱码的问题,或者需要其他编码处理。 首先,PrimeFaces的文件上传组件默认可能使用服务器的编码方式,通常是UTF-8,但有时候客户端和服务器端的编码不一致会导致问题。用户可能希望确保上传后的文件名正确显示,尤其是在不同语言环境下。 我应该分步骤解释解决方案。可能的方法包括在前端JavaScript中处理编码,或者在后端Bean中转换编码。另外,PrimeFaces本身是否有相关配置选项也需要考虑。 首先,前端部分:在上传前,用户可能需要用JavaScript获取文件名,并进行编码处理,比如使用encodeURIComponent或者escape函数。但需要注意,服务器端需要做相应的解码。 然后,后端处理:当文件上传到服务器,可能需要从请求中读取原始文件名,并用正确的编码重新解码。例如,在Java中使用new String(fileName.getBytes("ISO-8859-1"), "UTF-8")这样的方式转换编码,具体取决于服务器接收数据的方式。 另外,PrimeFaces的FileUploadEvent对象可能包含上传的文件信息,可以在监听器方法中处理文件名。比如使用event.getFile().getFileName()获取文件名,然后进行编码转换。 还需要注意,如果使用Apache Commons FileUpload库处理上传,可能需要检查其编码设置,或者在web.xml中配置CharacterEncodingFilter来确保正确的编码处理。 另外,可能涉及到MultipartConfigElement的配置,或者在Spring等框架中的编码配置。但用户可能只需要一个基本的解决方案,不需要涉及太多框架。 此外,用户可能需要同时处理表单数据的编码,确保整个请求的编码一致。比如在XHTML页面中设置accept-charset="UTF-8",或者在web.xml中配置过滤器。 最后,要给出示例代码,包括前端JavaScript的编码处理和后端Bean的解码步骤,以及可能的配置调整。同时提醒常见的陷阱,比如不同浏览器文件名编码的差异处理,服务器端和客户端编码不一致的问题。 还要考虑是否需要自定义编码的更多细节,比如加密或特定格式的文件名,但根据问题描述,用户主要是解决乱码问题,所以重点在字符编码转换。 总结步骤: 1. 前端使用JavaScript获取文件名并进行编码。 2. 后端接收文件名后解码处理。 3. 配置服务器端的编码设置。 4. 可能需要使用过滤器或拦截器统一处理编码。</think>在 PrimeFaces 的 `<p:fileUpload>` 组件中自定义文件名编码,通常是为了处理 **中文文件名乱码** 或 **跨平台编码不一致** 的问题。以下是完整的解决方案: --- ### ✅ 核心思路 1. **前端编码**:使用 JavaScript 对文件名进行 URL 编码(如 `encodeURIComponent`)。 2. **后端解码**:在 Bean 中接收文件名后,使用 `URLDecoder.decode()` 解码。 3. **服务器端统一编码**:通过过滤器或配置确保整个请求使用 UTF-8 编码。 --- ### 🧩 示例代码(XHTML 页面) ```xhtml <h:form enctype="multipart/form-data" accept-charset="UTF-8"> <!-- 隐藏字段用于传递编码后的文件名 --> <h:inputHidden id="encodedFileName" value="#{fileUploadBean.fileName}" /> <!-- 文件上传组件,绑定 onchange 事件 --> <p:fileUpload id="fileUpload" mode="advanced" oncomplete="handleFileUpload()" onchange="setEncodedFileName(this.files[0].name)"> <f:ajax execute="@this" listener="#{fileUploadBean.onFileSelect}" /> </p:fileUpload> <p:commandButton value="提交" action="#{fileUploadBean.submit}" /> </h:form> <script> // 对文件名进行 URL 编码后写入隐藏字段 function setEncodedFileName(fileName) { var encodedName = encodeURIComponent(fileName); // 编码为 UTF-8 document.getElementById('encodedFileName').value = encodedName; } function handleFileUpload() { alert('文件上传完成!'); } </script> ``` --- ### 🧱 对应的 Bean 代码(Java) ```java @ManagedBean @RequestScoped public class FileUploadBean { private String fileName; public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } // 文件选择事件处理(可选) public void onFileSelect(AjaxBehaviorEvent event) { // 可在此预处理文件名 } // 提交方法 public String submit() { try { // 使用 URLDecoder 解码 String decodedName = java.net.URLDecoder.decode(fileName, "UTF-8"); System.out.println("解码后的文件名:" + decodedName); } catch (Exception e) { e.printStackTrace(); } return "success"; } } ``` --- ### ⚙️ 服务器端配置建议(web.xml) ```xml <!-- 设置字符编码过滤器 --> <filter> <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` --- ### ⚠️ 常见问题与注意事项 1. **浏览器兼容性**:`encodeURIComponent` 在现代浏览器中兼容良好,但旧版 IE(如 IE9 及以下)需谨慎使用。 2. **文件名长度限制**:URL 编码会增加文件名长度,注意 HTTP 请求长度限制。 3. **服务器端编码一致性**:确保服务器端接收请求时使用 UTF-8 编码,避免解码失败。 4. **安全处理**:对解码后的文件名进行校验(如防止路径穿越攻击),避免恶意文件名注入。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值