我们在开发web系统时有时会有以下需求:
- 希望某类或者某已知MIME 类型的文件(比如:*.gif;*.txt;*.htm)能够在访问时弹出“文件下载”对话框
- 希望以原始文件名(上传时的文件名,例如:山东省政府1024号文件.doc)提供下载,但服务器上保存的地址却是其他文件名(如:12519810948091234_asdf.doc)
- 希望某文件直接在浏览器上显示而不是弹出文件下载对话框
近日在使用Content-disposition的使用出现UTF-8识别不了的情况,经过HttpUtility.UrlEncode(fileName,Encoding.UTF8)编码后的文件名称直接显示给用户了,如图:
名称为uft
8格式,但是ie6.0却识别不了,很是不解,以前曾经使用此种方法是可行的,只好利用Google了,经查找网络里大多为像Qihangnet写的这篇文章似的,我也贴出来供大家使用。
Qihangnet的这篇文章跟我的想法基本是相似的,在
HttpContext.Current.Response.AddHeader("Content-Disposition
"
, "attachment
; filename=\""
+
UTF_FileName(filename) +
".doc
\";"
);
中.doc的后缀名是关键,我在没有写.doc或.txt之类的后缀时,依旧跟上图一样,加上后缀后utf
8格式的字符串自动识别成汉字了
,至于为什么我还不是很清楚,贴出来让大家也注意一下就是了。
//------------------------------------------start-------------------------------------------------------------------
作者:Qihangnet
出处:http://www.qihangnet.com/PermaLink,guid,db65d50a-ba90-4229-a3a2-71b4f1b407b9.aspx
要解决上述需求就可以使用Content-disposition
来解决。第一个需求的解决办法是
Response.AddHeader "content-disposition
"
,"attachment
; filename=fname.ext"
将上述需求进行归我给出如下例子代码:
public
static
void
ToDownload(string
serverfilpath,string
filename)
{
FileStream fileStream =
new
FileStream(serverfilpath, FileMode.Open);
long
fileSize =
fileStream.Length;
HttpContext.Current.Response.ContentType =
"application/octet-stream"
;
HttpContext.Current.Response.AddHeader("Content-Disposition
"
, "attachment
; filename=\""
+
UTF_FileName(filename) +
".doc
\";"
);
////attachment
--- 作为附件下载
////inline --- 在线打开
HttpContext.Current.Response.AddHeader("Content-Length"
, fileSize.ToString());
byte
[] fileBuffer =
new
byte
[fileSize];
fileStream.Read(fileBuffer, 0, (int
)fileSize);
HttpContext.Current.Response.BinaryWrite(fileBuffer);
fileStream.Close();
HttpContext.Current.Response.End();
}
public
static
void
ToOpen(string
serverfilpath, string
filename)
{
FileStream fileStream =
new
FileStream(serverfilpath, FileMode.Open);
long
fileSize =
fileStream.Length;
HttpContext.Current.Response.ContentType =
"application/octet-stream"
;
HttpContext.Current.Response.AddHeader("Content-Disposition
"
, "inline; filename=\""
+
UTF_FileName(filename) +
".doc\";"
);
HttpContext.Current.Response.AddHeader("Content-Length"
, fileSize.ToString());
byte
[] fileBuffer =
new
byte
[fileSize];
fileStream.Read(fileBuffer, 0, (int
)fileSize);
HttpContext.Current.Response.BinaryWrite(fileBuffer);
fileStream.Close();
HttpContext.Current.Response.End();
}
private
static
string
UTF_FileName(string
filename)
{
return
HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8);
}
简单的对上述代码做一下解析,ToDownload方法为将一个服务器上的文件(serverfilpath为服务器上的物理地址),以某文件名(filename)在浏览器上弹出“文件下载”对话框,而ToOpen是将服务器上的某文件以某文件名在浏览器中显示/打开的。注意其中我使用了UTF_FileName方法,该方法很简单,主要为了解决包含非英文/数字名称的问题,比如说文件名为“衣明志.doc”,使用该方法客户端就不会出现乱码了。
//*---------------------------end----------------------------------
园子里liping13599168的下载函数也不错,顺便也贴一下:
出处:http://www.cnblogs.com/liping13599168/archive/2008/07/31/672025.html
文件下载函数
<!---->using
System.Threading;
///
<summary>
///
///
</summary>
///
<param name="_Request">
读取客户端在 Web 请求期间发送的 HTTP 值
</param>
///
<param name="_Response">
封装来自 ASP.NET 操作的 HTTP 响应信息
</param>
///
<param name="_fileName">
目的文件名称
</param>
///
<param name="_fullPath">
源文件路径
</param>
///
<param name="_speed"></param>
///
<returns>
是否成功
</returns>
public
static
bool
ResponseFile(HttpRequest _Request, HttpResponse _Response,
string
_fileName,
string
_fullPath,
long
_speed)
{
try
{
FileStream myFile
=
new
FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryReader br
=
new
BinaryReader(myFile);
try
{
_Response.AddHeader(
"
Accept-Ranges
"
,
"
bytes
"
);
_Response.Buffer
=
false
;
long
fileLength
=
myFile.Length;
long
startBytes
=
0
;
double
pack
=
10240
;
//
10K bytes
//
int sleep = 200;
//
每秒5次 即5*10K bytes每秒
int
sleep
=
(
int
)Math.Floor(
1000
*
pack
/
_speed)
+
1
;
if
(_Request.Headers[
"
Range
"
]
!=
null
)
{
_Response.StatusCode
=
206
;
string
[] range
=
_Request.Headers[
"
Range
"
].Split(
new
char
[] {
'
=
'
,
'
-
'
});
startBytes
=
Convert.ToInt64(range[
1
]);
}
_Response.AddHeader(
"
Content-Length
"
, (fileLength
-
startBytes).ToString());
if
(startBytes
!=
0
)
{
//
Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
}
_Response.AddHeader(
"
Connection
"
,
"
Keep-Alive
"
);
_Response.ContentType
=
"
application/octet-stream
"
;
_Response.AppendHeader(
"
Content-Disposition
"
,
"
attachment; filename=\
""
+ HttpUtility.UrlEncode(_fileName, System.Text.Encoding.UTF8) +
"
.txt\
"
;
"
);
br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
int
maxCount
=
(
int
)Math.Floor((fileLength
-
startBytes)
/
pack)
+
1
;
for
(
int
i
=
0
; i
<
maxCount; i
++
)
{
if
(_Response.IsClientConnected)
{
_Response.BinaryWrite(br.ReadBytes(
int
.Parse(pack.ToString())));
Thread.Sleep(sleep);
}
else
{
i
=
maxCount;
}
}
}
catch
{
return
false
;
}
finally
{
br.Close();
myFile.Close();
}
}
catch
{
return
false
;
}
return
true
;
}
//
调用方法
Page.Response.Clear();
bool
success
=
ResponseFile(Page.Request, Page.Response,
"
目的文件名称
"
,
@"
源文件路径
"
,
1024000
);
if
(
!
success)
Response.Write(
"
下载文件出错!
"
);
Page.Response.End();
相关推荐
本文将深入探讨Content-Disposition的使用方法及其注意事项,帮助开发者更好地理解和应用这一技术。 一、Content-Disposition的作用 1. 控制文件下载:当设置为 "attachment" 时,浏览器会弹出“文件下载”对话框,...
#### 五、注意事项 - **安全性**:确保上传文件的合法性,防止恶意文件上传。 - **资源管理**:合理配置最大文件大小、内存使用限制等,避免资源耗尽。 - **错误处理**:完善错误处理机制,确保程序的健壮性。 综...
#### 注意事项 - 在设置`Content-Disposition`时,需要注意文件名的编码方式,以确保不同浏览器和操作系统都能够正确识别文件名。上述示例中给出了两种方法,一种是使用`Server.UrlEncode`,另一种是使用`...
### 六、注意事项 - 在设置响应头之前,应确保所有输出流已被关闭,避免出现乱码问题。 - 对于包含中文的文件名,必须使用正确的字符编码(如UTF-8),否则可能导致文件名显示错误。 - 应考虑到不同浏览器对响应头...
2. 设置响应头:使用`header()`函数设置`Content-Type`和`Content-Disposition`。 3. 输出文件内容:使用`readfile()`或`file_get_contents()`函数读取文件内容,并将其发送到浏览器。 以下是一个简单的PHP文件下载...
3. **设置响应头**:使用`response.setHeader()`方法设置`Content-Disposition`和`Content-Type`头信息。例如: ```java response.setContentType("application/octet-stream"); // 适用于未知或二进制类型的文件 ...
在JavaServer Pages (JSP) 中,文件下载是常见的功能,尤其在Web...通过以上步骤和注意事项,你可以构建出一个安全、高效的文件下载功能。在实际开发中,还可以结合Spring MVC、Struts等框架进行更高级的处理和优化。
- 使用Content-Disposition头设置为附件,避免浏览器自动执行文件。 11. **日志安全**: - 不要在日志中记录敏感信息,如密码、信用卡号等。 - 使用日志等级控制,生产环境中避免输出过多敏感信息。 12. **错误...
#### 三、注意事项 - **编码问题**:在设置`Content-Type`和`Content-Disposition`时,需注意字符编码,以免文件名或类型在传输过程中出现乱码。 - **安全性**:确保只允许下载合法且安全的文件,防止潜在的安全...
#### 知识点五:注意事项与优化建议 1. **文件路径问题**:确保文件路径正确无误,且用户有访问权限。 2. **文件类型**:根据不同的文件类型,可能需要调整`Content-Disposition`中的`filename`参数,确保文件...
#### 注意事项 - 需要正确配置Servlet的URL映射,例如`/day06/ServletDownload`。 - 为了防止路径遍历攻击,确保Servlet安全地处理文件路径。 - 对于大文件,应考虑使用流处理以避免内存溢出。 - 如果文件位于Web...
#### 四、注意事项 **4.1 安全性** 在处理文件上传时,安全性非常重要。需要对上传的文件进行验证,例如限制文件大小、检查文件类型等,防止恶意文件导致的安全问题。 **4.2 性能优化** 对于大文件的上传下载,...
以下是关于如何使用PHP直接下载图片的详细步骤和注意事项: 1. **读取图片文件**: 首先,你需要获取到图片的路径,可以是相对路径或绝对路径。使用`file_get_contents()`函数读取图片文件的内容。例如: ```php ...
### 注意事项 1. **安全**:在实际应用中,应确保只有授权的用户才能访问和下载文件,防止未授权的访问。 2. **编码**:确保正确设置文件的`Content-Type`,以确保浏览器能够正确识别和处理文件。同时,对于非ASCII...
注意事项 - **安全问题**:确保只允许下载合法的文件,避免非法访问。 - **兼容性**:不同的浏览器对`Content-Disposition`的处理可能不同,需要注意测试兼容性。 - **效率问题**:对于大文件的下载,需要注意...
### 应用场景与注意事项 #### 应用场景 - **文件分享网站**:允许用户上传和下载文件。 - **网盘服务**:提供在线存储空间,并支持文件的上传和下载。 - **软件分发平台**:用于发布软件安装包、文档等。 #### ...
#### 四、注意事项 - 在实际应用中,还需要考虑安全性问题,确保敏感数据不被泄露。 - 浏览器的兼容性也是一个重要因素,不同的浏览器可能对文件的处理方式有所不同。 - 对于更复杂的应用场景,可以考虑使用专门的...
#### 三、注意事项 1. **浏览器兼容性**:不同的浏览器对文件名的编码方式可能有不同的处理方式。因此,在开发过程中需要考虑多种浏览器的兼容性问题,确保在各种浏览器下都能正常下载文件。 2. **编码一致性**:...
五、实际应用与注意事项 在实际项目中,可能还需要考虑以下因素: - 安全性:确保只有授权用户才能访问和下载特定文件。 - 性能优化:可以使用缓存技术,减少对硬盘的读取次数,或者利用CDN加速大文件的传输。 - ...