struts—文件的上传和下载
设计了一个小的案例:上传图片到服务器,上传成功后显示图片列表,然后点击下载上传到服务器的图片。
注意表单的配置属性:
<form enctype="multipart/Form-data" action="/strutsFilleupAndDown/register.do" method="post">
名字:<input type="text" name="name"><br>
头像:<input type="file" name="myphoto"><br>
<input type="submit" value="注册用户">
</form>
注意UserForm表单中设置的属性类型相匹配:
private String name;
private FormFile myphoto;
问题:1.中文名字的文件? 2.存在文件覆盖?
*1.覆盖文件的问题?
思路:
①为了防止新取得的文件名称重复,先看有没有该文件,如果有了,则给以后上传的文件去一个名字,为了防止文件名称重复(年+月+日+时分秒)
②编写一个工具类,可以生成一个不重复的文件名,然后再保存
public class Mytools {
public static String getNewFileName(String fileName){
int beginIndex=fileName.lastIndexOf(".");
String newFilename=UUID.randomUUID().toString()+fileName.substring(beginIndex,fileName.length());
return newFilename;
}
}
在action中,调用方法即可。
*2.如果文件名是中文怎么办?
思路:
①上传的时候使用过滤器转成utf-8编码,使得服务器能够识别文件,方便处理。
②在数据库中设计一个中间转换的一个表,存放原文件名和通过处理的文件名。
③下载的时候由于<img>请求是get请求,而过滤器对get请求时不生效的,文件名还是乱码,服务器无法识别文件,导致无法读取文件。在action中进行处理。
java.net.URLEncoder.encode(user.getPhoto2(),"utf-8")
Users表
Mysql中not null和unique在一起自动转为主键
Create table users_2(
Username varchar(64) unique not null,
Photo varchar(128) not null,
Photo2 varchar(128) not null
)
文件上传action:
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.xidian.struts.action; import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile; import com.xidian.domain.Users;
import com.xidian.service.UserService;
import com.xidian.struts.form.UserForm;
import com.xidian.utils.Mytools; /**
* MyEclipse Struts
* Creation date: 08-23-2016
*
* XDoclet definition:
* @struts.action
*/
public class RegisterAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
UserForm userForm=(UserForm)form;
String name=userForm.getName();
FormFile formFile=userForm.getMyphoto();
//通过formFile我们可以获取用户上传文件的各种信息
String filename=formFile.getFileName();
int fileSize=formFile.getFileSize();
String NewFileName=Mytools.getNewFileName(filename);
System.out.println(NewFileName+""+fileSize);
//获取输入流
InputStream is=null;
OutputStream os=null;
try {
is=formFile.getInputStream();
//得到一个输出流->文件
//1.得到file文件夹上传到tomcat服务器的绝对路径
String saveFilePath=this.getServlet().getServletContext().getRealPath("/file");
System.out.println("saveFilePath="+saveFilePath);
os=new FileOutputStream(saveFilePath+"\\"+NewFileName);
//读取文件并写出到服务器路径file
int len=0;
//做一个buffer缓存
byte[] bytes=new byte[1024];
//循环处理
while((len=is.read(bytes))>0){
//读一点写一点
os.write(bytes, 0, len);
}
//如果用户的头像上传到数据库中,我们就保存到数据库中
UserService userService=new UserService();
Users user= new Users();
user.setUsername(name);
user.setPhoto(NewFileName); //保存新的文件名
user.setPhoto2(filename);
if(userService.addUser(user)){
return mapping.findForward("ok");
} } catch (Exception e) {
e.printStackTrace(); } finally{
try {
os.close();
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} return mapping.findForward("err"); }
}
文件下载action:
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.xidian.struts.action; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping; import com.xidian.domain.Users;
import com.xidian.service.UserService; public class DownloadAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) { //获取用户的名称
String username=request.getParameter("user");
//获取user对象
UserService userService=new UserService();
Users user=userService.getUser(username); response.setContentType("text/html;charset=utf-8"); //如果文件名有中文,需要对其进行url编码
String name=null; try {
response.setHeader("Content-Disposition", "attachment;filename="+ java.net.URLEncoder.encode(user.getPhoto2(),"utf-8"));
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} //下载文件
//1.先获取到要下载文件的绝对路径
String filePath=this.getServlet().getServletContext().getRealPath("/file");
String fileAllPath=filePath+"\\"+user.getPhoto();
FileInputStream fis=null;
OutputStream os=null;
byte[] buffer=new byte[1024];
int len=0;
try { fis=new FileInputStream(fileAllPath);
os=response.getOutputStream();
while((len=fis.read(buffer))>0){
os.write(buffer, 0, len);
} } catch (Exception e) { e.printStackTrace();
} finally{
try {
os.close();
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } return mapping.findForward("back");
}
}
疑问?
在文件下载的时候含中文名字的文件不能下载,查找方法用:
response.setHeader("Content-Disposition", "attachment;filename="+ java.net.URLEncoder.encode(user.getPhoto2(),"utf-8"));
对获取到的文件名进行编码,并没能解决,报出错误:
java.lang.NullPointerException java.net.URLEncoder.encode
没能找出原因。
UserService代码:
package com.xidian.service; import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import com.xidian.domain.Users;
import com.xidian.utils.SqlHelper; public class UserService {
public Users getUser(String username){
Users user=new Users();
String sql="select * from users_2 where username=?";
String[] parameters={username};
ResultSet rs=SqlHelper.executeQuery(sql, parameters);
try {
if(rs.next()){ user.setUsername(rs.getString(1));
user.setPhoto(rs.getString(2));
user.setPhoto2(rs.getString(3));
return user;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return user;
} public boolean addUser(Users user){
boolean b=true;
String sql="insert into users_2 values (?,?,?)";
String parameters[]={user.getUsername(),user.getPhoto(),user.getPhoto2()};
try{
SqlHelper.executeUpdate(sql, parameters);
}catch(Exception e){
b=false;
}
return b;
} public ArrayList getUserList(){
String sql="select * from users_2";
ResultSet rs=SqlHelper.executeQuery(sql, null);
ArrayList al=new ArrayList();
try {
while(rs.next()){
Users users=new Users();
users.setUsername(rs.getString(1));
users.setPhoto(rs.getString(2));
users.setPhoto2(rs.getString(3));
al.add(users);
}
return al;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return al;
} } }
struts—文件的上传和下载的更多相关文章
- java实现文件的上传和下载
1. servlet 如何实现文件的上传和下载? 1.1上传文件 参考自:http://blog.csdn.net/hzc543806053/article/details/7524491 通过前台选 ...
- JavaWeb中文件的上传和下载
JavaWeb中文件的上传和下载 转自: JavaWeb学习总结(五十)——文件上传和下载 - 孤傲苍狼 - 博客园https://www.cnblogs.com/xdp-gacl/p/4200090 ...
- JSP文件的上传和下载
文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...
- java实现ftp文件的上传与下载
最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...
- 在SpringMVC框架下实现文件的 上传和 下载
在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8" ...
- SecureCRT使用sz和rz命令进行文件的上传和下载
SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. ...
- 使用FTPClient进行文件服务器内文件的上传和下载
我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ...
- iOS开发中文件的上传和下载功能的基本实现-备用
感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...
- Apache FtpServer 实现文件的上传和下载
1 下载需要的jar包 Ftp服务器实现文件的上传和下载,主要依赖jar包为: 2 搭建ftp服务器 参考Windows 上搭建Apache FtpServer,搭建ftp服务器 3 主要代码 在ec ...
随机推荐
- jQuery贪吃蛇--jQuery学习
我用JQuery有一段时间了,越来越体会到其强大之处,于是自己尝试写了一个贪吃蛇小游戏,拿来与网友分享一下. 1. 了解JQuery.Timers 除用到了jQuery1.5.1之外,我还用到了jQu ...
- python+selenium运行报错UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
使用python+selenium运行自动化脚本时,打印某一段文字出现UnicodeEncodeError: 'ascii' codec can't encode characters in posi ...
- C++标准库vector类型详解
Vector简介 vector是定义在C++标准模板库,它是一个多功能.能够操作多种数据结构和算法的模板类(关于模板类我们后面会介绍,如何创建自己的模板类).vector是一个容器,能够像容器一样存放 ...
- CSS中如何实现未知尺寸图片垂直居中
在曾经的 淘宝UED 招聘 中有这样一道题目: “使用纯CSS实现未知尺寸的图片(但高宽都小于200px)在200px的正方形容器中水平和垂直居中.” 当然出题并不是随意,而是有其现实的原因,垂直居中 ...
- android rectF
new Rect(left , top, right , bottom) 这个构造方法需要四个参数这四个参数 指明了什么位置 ?我们就来解释怎么画 这个 矩形 这四个 参数 分别代表的意思是:left ...
- JSP网站开发基础总结《七》
按照计划本篇将为大家总结搜索功能的两种实现:确定搜索与模糊搜索.所谓精确搜索便是指,根据用户的输入的搜索内容,在数据库中寻找具有一一对应的关系的数据,一般都是用户在数据库中的主键值.而模糊搜索,是一种 ...
- CSS Shake – 摇摆摇摆!动感的 CSS 抖动效果
CSS Shake 是一套 CSS3 动画特效,让页面的 DOM 元素实现各种效果的抖动(Shake),这些效果可以轻松的被应用到按钮.LOGO 以及图片等元素.所有这些效果都是只需要单一的标签,加上 ...
- Elaticsearch REST API常用技巧
在Elasticsearch的REST API中,有很多使用技巧,这里针对官方文档给出的介绍,总结了几个常用的例子. 更多内容参考:Elastisearch文档总结 多索引 ES支持在一次请求中指定多 ...
- Lucene查询语法详解
Lucene查询 Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询. 下面着重介绍下Lucene支持的查询: Terms词语查询 词语搜索,支持 单词 和 ...
- 前端工程化开发之yeoman、bower、grunt
上两遍文章介绍了前端模块化开发(以seaJs为例)和前端自动化开发(以grunt为例)的流程,参见: http://www.cnblogs.com/luozhihao/p/4818782.html ( ...