response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition","p_w_upload; filename="+as+"");
1. HTTP消息头
(1)通用信息头
即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma
主要: Cache-Control , Connection , Data , Pragma , Trailer , Transfer-Encoding , Upgrade
(2)请求头
用于在请求消息中向服务器传递附加信息,主要包括客户机可以接受的数据类型,压缩方法,语言,以及客户计算机上保留的信息和发出该请求的超链接源地址等.
主要: Accept , Accept-Encoding , Accept-Language , Host
(3)响应头
用于在响应消息中向客户端传递附加信息,包括服务程序的名称,要求客户端进行认证的方式,请求的资源已移动到新地址等.
主要: Location , Server , WWW-Authenticate(认证头)
(4)实体头
用做实体内容的元信息,描述了实体内容的属性,包括实体信息的类型,长度,压缩方法,最后一次修改的时间和数据的有效期等.
主要: Content-Encoding , Content-Language , Content-Length , Content-Location , Content-Type
(4)扩展头
主要:Refresh, Content-Disposition
2. 几个主要头的作用
(1)Content-Type的作用
该实体头的作用是让服务器告诉浏览器它发送的数据属于什么文件类型。
例如:当Content-Type 的值设置为text/html和text/plain时,前者会让浏览器把接收
到的实体内容以HTML格式解析,后者会让浏览器以普通文本解析。
====================
在进行Web开发时,可能遇到遇到以下几种需求:
l 希望某类或者某已知MIME 类型的文件(比如:*.gif;*.txt;*.htm)能够在访问时弹出“文件下载”对话框。
l 希望客户端下载时以指定文件名显示。
l 希望某文件直接在浏览器上显示而不是弹出文件下载对话框。
对于上面的需求,使用Content-Disposition属性就可以解决。下面是代码示例:
response.setHeader("Content-disposition", "p_w_upload;filename=" + fileName)。
//Content-disposition为属性名。
//p_w_upload表示以附件方式下载。如果要在页面中打开,则改为inline。
//filename如果为中文,则会出现乱码。解决办法有两种:
//1、使用fileName = new String(fileName.getBytes(), "ISO8859-1")语句
//2、使用fileName = HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8)语句
==========================
Servlet文件下载:
一个使用Servlet文件实现文件下载的实例
一个使用Servlet文件实现文件下载的实例
(可以扩充本实例实现:对用户隐藏他要下载文件的路径,或者在下载文件时要做一些
其他的工作,如检查用户有没有下载此文件的权限等)
了解在Servlet中如何控制输出流以及response对象的contentType相关知识
一个Servlet文件DownloadFile,在此Servlet中读取要下载的文件,然后写到响应流中以
达到用户下载文件的目的。要下载的文件可以放在任何地方,并且是对用户隐藏的。
在DownloadFile Servlet中,首先要得到要下载文件的文件名filename,同时要预先定义好文
件保存的路径,然后设置response对象的内容类型和头信息,最后读取要下载文件的字节流
并写到response的输出流中。
DownloadFile.java源文件
DownloadFile.java源文件 package myservlet; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class DownloadFile extends HttpServlet { //字符编码 private final String ENCODING="GB2312"; //内容类型 private final String CONTENT_TYPE="text/html;charset=gb2312"; //要下载的文件存放的路径 private String downloadfiledir="d:\\temp\\"; public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{ //设置request对象的字符编码 request.setCharacterEncoding(ENCODING); //从request中取出要下载文件的名字 String filename=request.getParameter("filename"); if(filename==null||filename.trim().equals("")){ //设置response对象的ContentType response.setContentType(CONTENT_TYPE); //输出错误信息 PrintWriter out=response.getWriter(); out.println("<font color=red>输入的文件名无效!</font>"); out.close(); }else{ //下载文件的完整路径名 String fullfilename=downloadfiledir+filename; System.out.println("下载文件:"+fullfilename); //根据文件的类型设置response对象的ContentType String contentType=getServletContext().getMimeType(fullfilename); if(contentType==null) contentType="application/octet-stream"; response.setContentType(contentType); //设置response的头信息 response.setHeader("Content-disposition","p_w_upload;filename=\""+filename+"\""); InputStream is=null; OutputStream os=null; try{ is=new BufferedInputStream(new FileInputStream(fullfilename)); //定义输出字节流 ByteArrayOutputStream baos=new ByteArrayOutputStream(); //定义response的输出流 os=new BufferedOutputStream(response.getOutputStream()); //定义buffer byte[] buffer=new byte[4*1024]; //4k Buffer int read=0; //从文件中读入数据并写到输出字节流中 while((read=is.read(buffer))!=-1){ baos.write(buffer,0,read); } //将输出字节流写到response的输出流中 os.write(baos.toByteArray()); }catch(IOException e){ e.printStackTrace(); }finally{ //关闭输出字节流和response输出流 os.close(); is.close(); } } } public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{ //调用doGet()方法 doGet(request,response); } }
JS构造form表单上传文件 :
在上传文件时,我们都知道需要在form表单中加上enctype="multipart/form-data"。
而在开发过程中,也有可能遇到需要用javascripts构造form表单的情况。
一般javascript构造form,可以使用以下方法:
var form = document.createElement('form');
form.id="the_form";
form.action="/img.php";
form.method='post';
form.name="the_form_";
当javascript构造的form,遇到需要上传文件的时候,本以为直接加一句
form.enctype="multipart/form-data"就能解决问题,却发现满不是那么回事。
从网上搜了一些原因,最终找到解决原因,原来javascript的form的对象名并不应该是
enctype,而应该是encding,改为form.encding="multipart/form-data",问题解决。
将表单放到HTML标签中可以使用以下代码:
var parNode = document.getElementById("plus");
parNode.appendChild(form);//在plus中增加form表单,plus为html中的一个层
表单中也可以放入input、checkbox等表单,可以使用以下代码,通
过表单的对象可以改变表单的类型和值:
var input=document.createElement("input");
input.id="upfile_1";
input.name="upfile_1";
input.type="file";
input.className="file_upload";
input.onchange=function (){//点击表单时调用upload_pic()函数 upload_pic(); }
form.appendChild(input);//在form中追加input表单
在WEB开发中,经常会遇到上传文件的情况,判断上传文件的大小也是不可缺少的,在服务器端判断文件的大小很方便,对于php来说都有相应的函数支持,在这里我们介绍在客户端用javascript判断文件大小的两种常见的方法。
第一种方法:是应用ActiveX控件的实现,例如:
<script type="text/javascript">
function getFileSize(filePath){
var fso = new ActiveXObject("Scripting.FileSystemObject");
alert("文件大小为:"+fso.GetFile(filePath).size);
}
</script>
<body>
<INPUT TYPE="file" NAME="file" SIZE="30" onchange="getFileSize(this.value);">
</body>
这种方法可以实现,也容易被开发人员想到,但是唯一不足之处是有安全提示,当然把文件名改为.hta则会屏蔽掉安全提示,但很难被需求所取。不推荐,也不多说 .
第二种方法:在html标签中有一个不为一般开发人员“深”知的img标签,先来说下他有的属性:src,dynsrc,start,alt,controls,loop,loopdelay,hspace,vspace....还有一些常用的属性就不列出来了,在这里我们说一下"dynsrc"这个属性:dynsrc可以用来插入各种多媒体,格式可以是Wav、Avi、AIFF、AU、MP3、Ra、Ram等等。url为音频或视频文件及其路径,可以是相对路径或绝对路径。
示例:<img dynsrc="xxxx.mp3">
这样我们就可以根据dynsrc动态赋值任何类型文件的路径,在javascript中根据Image对象本身的fileSize属性来得到文件的大小。当然Image对象还有其他的几个属性,例如:fileCreatedDate、fileModifiedDate、fileSize、fileUpdatedDate、filters... , 代码如下:
<script type="text/javascript">
function getFileSize(filePath) {
var p_w_picpath=new Image();
p_w_picpath.dynsrc=filePath;
alert(p_w_picpath.fileSize);
}
</script>
<body>
<INPUT TYPE="file" NAME="file" SIZE="30" onchange="getFileSize(this.value)">
</body>
先可以通过修改浏览器的安全级别,步骤是:
工具 -> Internet选项 -> 安全 -> 自定义级别 -> 找到“其他”中的“将本地文件上载至服务器时包含本地目录路径”,选中“启用”即可。
当然上述的方法肯定不可取,总不能让每一个用户都修改ie配置吧,下面给出一种用js代码修改的方法
兼容ie ,firefox全系列
function getPath(obj)
{
if(obj)
{
if (window.navigator.userAgent.indexOf("MSIE")>=1)
{
obj.select();
return document.selection.createRange().text;
}
else if(window.navigator.userAgent.indexOf("Firefox")>=1)
{
if(obj.files)
{
return obj.files.item(0).getAsDataURL();
}
return obj.value;
}
return obj.value;
}
}
修改后代码:
webObj.HttpAddPostFile("p_w_upload", getPath(document.getElementById("p_w_upload")));
js给action传真是地址的时候,处于安全,传到action中 浏览器会改变路径变为C:\fakepath\ftp.txt,但是原始路径却是 C:\Documents and Settings\Administrator\桌面\ftp.txt 下面就是获得原始路径的方法 var url = getPath(document.getElementByIdx_x("url")) function getPath(obj) { if (obj) { if (window.navigator.userAgent.indexOf("MSIE") >= 1) { obj.select(); return document.selection.createRange().text; } else if (window.navigator.userAgent.indexOf("Firefox") >= 1) { if (obj.files) { return obj.files.item(0).getAsDataURL(); } return obj.value; } return obj.value; } }
var getPath=function(obj,fileQuery,transImg){ if(window.navigator.userAgent.indexOf("MSIE")>=1){ obj.select(); var path=document.selection.createRange().text; obj.removeAttribute("src"); obj.setAttribute("src",transImg); obj.style.filter= "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+path+"', sizingMethod='scale');"; } else{ var file =fileQuery.files[0]; var reader = new FileReader(); reader.onload = function(e){ obj.setAttribute("src",e.target.result) } reader.readAsDataURL(file); } }