一、文件上传
上传文件是Web开发中经常要用到的功能:例如在基于B/S的人事信息管理系统中上传照片,在新闻发布系统中上传图片等等。。。。。要实现文件上传功能,就需要综合利用java中的文件输入和输出相关的类。
在TCP/IP中,最早出现的文件上传机制是FTP。它是将文件由客服端发送到服务器的标准机制,能够考虑到跨平台的文本和二进制格式文件。但是在jsp编程中不能使用FTP方法来上传文件,这是由jsp 运行机制所决定的。
下面是上传文件的jsp页面:
复制代码 代码如下:
<form action="file?file=upload" method="post" enctype="multipart/form-data">
请选择你要上传的文件:<input type="file" name="upload" siez="16"><br>
<input type="submit" value="提交">
</form>
对于文件上传表单处理其中method必须为post,也要增加类型enctype="multipart/form-data"。这样就可以把文件中的数据作为流式数据上传。当然无论是什么文件格式,均可以。。。
下面是servlet 处理程序:
复制代码 代码如下:
//接收上传文件内容中临时文件的文件名
String tempFileName = new String("tempFileName");
//tempfile 对象指向临时文件
File tempFile = new File("D:/"+tempFileName);
//outputfile 文件输出流指向这个临时文件
FileOutputStream outputStream = new FileOutputStream(tempFile);
//得到客服端提交的所有数据
InputStream fileSourcel = request.getInputStream();
//将得到的客服端数据写入临时文件
byte b[] = new byte[1000];
int n ;
while ((n=fileSourcel.read(b))!=-1){
outputStream.write(b,0,n);
}
//关闭输出流和输入流
outputStream.close();
fileSourcel.close();
//randomFile对象指向临时文件
RandomAccessFile randomFile = new RandomAccessFile(tempFile,"r");
//读取临时文件的第一行数据
randomFile.readLine();
//读取临时文件的第二行数据,这行数据中包含了文件的路径和文件名
String filePath = randomFile.readLine();
//得到文件名
int position = filePath.lastIndexOf('\\');
CodeToString codeToString = new CodeToString();
String filename = codeToString.codeString(filePath.substring(position,filePath.length()-1));
//重新定位读取文件指针到文件头
randomFile.seek(0);
//得到第四行回车符的位置,这是上传文件数据的开始位置
long forthEnterPosition = 0;
int forth = 1;
while((n=randomFile.readByte())!=-1&&(forth<=4)){
if(n=='\n'){
forthEnterPosition = randomFile.getFilePointer();
forth++;
}
}
//生成上传文件的目录
File fileupLoad = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file","upLoad");
fileupLoad.mkdir();
//saveFile 对象指向要保存的文件
File saveFile = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file/upLoad",filename);
RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile,"rw");
//找到上传文件数据的结束位置,即倒数第四行
randomFile.seek(randomFile.length());
long endPosition = randomFile.getFilePointer();
int j = 1;
while((endPosition>=0)&&(j<=4)){
endPosition--;
randomFile.seek(endPosition);
if(randomFile.readByte()=='\n'){
j++;
}
}
//从上传文件数据的开始位置到结束位置,把数据写入到要保存的文件中
randomFile.seek(forthEnterPosition);
long startPoint = randomFile.getFilePointer();
while(startPoint<endPosition){
randomAccessFile.write(randomFile.readByte());
startPoint = randomFile.getFilePointer();
}
//关闭文件输入、输出
randomAccessFile.close();
randomFile.close();
tempFile.delete();
其中CodeToString()方法是一个中文字符处理的方法。如果文件不进行编码转换,则上传后的文件名将会是乱码,接收的文件数据也会是乱码:
下面是CodeToString()源代码:
复制代码 代码如下:
//处理中文字符串的函数
public String codeString(String str){
String s = str;
try {
byte[] temp = s.getBytes("utf-8");
s = new String(temp);
return s ;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return s;
}
}
二:文件下载
实现文件下载的最简单的方法就是使用超链接。假设在服务器上web目录下地upload子目录存在user.doc这个文档。如:
<a href="http://localhost:8080/upload/user.doc">下载user.doc</a>
当单击这个超级链接时,将会在浏览器中直接打开这个文档,就像是把word软件嵌入在浏览器中一样。
打开文档后就可以实现另存为了。当然在web上,最常见的方式是单击链接后,出现“另存为”对话框:
复制代码 代码如下:
//获取要下载的文件名
String filename = request.getParameter("name");
//得到想客服端输出的输出流
OutputStream outputStream = response.getOutputStream();
//输出文件用的字节数组,每次向输出流发送600个字节
byte b[] = new byte[600];
//要下载的文件
File fileload = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file/upLoad",filename);
//客服端使用保存文件的对话框
response.setHeader("Content-disposition", "attachment;filename="+filename);
//通知客服文件的MIME类型
response.setContentType("application/msword");
//通知客服文件的长度
long fileLength = fileload.length();
String length = String.valueOf(fileLength);
response.setHeader("Content_length", length);
//读取文件,并发送给客服端下载
FileInputStream inputStream = new FileInputStream(fileload);
int n = 0;
while((n=inputStream.read(b))!=-1){
outputStream.write(b,0,n);
}
在该程序中,response对象的setContentType()用来定义服务器发送给客服端内容的MIME类型。这里对MIME就不特别介绍了。事实上,凡是浏览器能处理的所有资源都有对应的MIME资源类型。在与服务器的交互中,浏览器就是对html、jsp等文件浏览器直接将其打开。对于word、excel等浏览器自身不能打开的文件则调用相应的方法。对于没有标记MIME类型的文件。浏览器则根据其扩展名和文件内容猜测其类型。。。
文件上传,jsp
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]