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 ...
随机推荐
- sql语句执行顺序
首先来一张朋友传给我的图 FORM: 对FROM的左边的表和右边的表计算笛卡尔积.产生虚表VT1 ON: 对虚表VT1进行ON筛选,只有那些符合<join-condition>的行才会被记 ...
- C++标准库vector类型详解
Vector简介 vector是定义在C++标准模板库,它是一个多功能.能够操作多种数据结构和算法的模板类(关于模板类我们后面会介绍,如何创建自己的模板类).vector是一个容器,能够像容器一样存放 ...
- SQL Server 错误日志收缩(ERRORLOG)
一.基础知识 默认情况下,错误日志位于 : C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\ERRORLOG 和ERRORLOG.n 文 ...
- KendoUI系列:TreeView
1.加载本地数据 <link href="@Url.Content("~/Content/kendo/2014.1.318/kendo.common.min.css" ...
- 【WP开发】使用磁倾仪
磁倾仪,也叫倾斜仪,主要用来检测手机设备在各个轴上旋转的角度.注意,磁倾仪与陀螺仪的差异,陀螺仪的关注点是旋转的角速度,它并不关注角度,只注重速度.而磁倾仪的读数就是设备倾斜的角度. 不管是使用重力感 ...
- OpenCascade Primitives BRep - Sphere
OpenCascade Primitives BRep - Sphere eryar@163.com Abstract. BRep is short for Boundary Representati ...
- 用命令行编译java并生成可执行的jar包
用命令行编译java并生成可执行的jar包 1.编写源代码. 编写源文件:CardLayoutDemo.java并保存,例如:I:\myApp\CardLayoutDemo.java.程序结构如下: ...
- 基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作
在前面介绍了很多篇相关的<Bootstrap开发框架>的系列文章,这些内容基本上覆盖到了我这个Bootstrap框架的各个主要方面的内容,总体来说基本达到了一个稳定的状态,随着时间的推移可 ...
- Android基于mAppWidget实现手绘地图(四)--如何附加javadoc
如何把javadoc添加到代码库中? How to attach javadoc to the library? 项目属性——>Java Build Path——>Libraries.选择 ...
- mysql管理知识点
mysql是完全开原的关系型数据库,在web后端用的比较多,经典的架构有LAMP,LNMP,其中的M就指mysql. 一:安装 新版的linux里默认的已经不是mysql,而是他的一个分支mariad ...