设计了一个小的案例:上传图片到服务器,上传成功后显示图片列表,然后点击下载上传到服务器的图片。

注意表单的配置属性:

<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—文件的上传和下载的更多相关文章

  1. java实现文件的上传和下载

    1. servlet 如何实现文件的上传和下载? 1.1上传文件 参考自:http://blog.csdn.net/hzc543806053/article/details/7524491 通过前台选 ...

  2. JavaWeb中文件的上传和下载

    JavaWeb中文件的上传和下载 转自: JavaWeb学习总结(五十)——文件上传和下载 - 孤傲苍狼 - 博客园https://www.cnblogs.com/xdp-gacl/p/4200090 ...

  3. JSP文件的上传和下载

    文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...

  4. java实现ftp文件的上传与下载

    最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...

  5. 在SpringMVC框架下实现文件的 上传和 下载

    在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8" ...

  6. SecureCRT使用sz和rz命令进行文件的上传和下载

    SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. ...

  7. 使用FTPClient进行文件服务器内文件的上传和下载

    我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ...

  8. iOS开发中文件的上传和下载功能的基本实现-备用

    感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...

  9. Apache FtpServer 实现文件的上传和下载

    1 下载需要的jar包 Ftp服务器实现文件的上传和下载,主要依赖jar包为: 2 搭建ftp服务器 参考Windows 上搭建Apache FtpServer,搭建ftp服务器 3 主要代码 在ec ...

随机推荐

  1. APP 版本更新 流程(已上架APP,提交新版本)

    背景: 今天发布app的新版本, 可是无奈换了电脑, 没有了以前上架时候的发布证书和描述文件. 但是没关系, 依然可以上传成功,哈哈哈~ 虽然走了很多弯路 - -|| 如果是向 App Store 提 ...

  2. BrowserSync前端调试工具使用

    上次介绍了一款DebugGap移动端调试工具DebugGap推荐.但是这几天使用了之后感觉还是有些不足,尤其是里面的调试工具虽然和Chrome里面的调试长的很像,但是多少有些不同,使用起来还是不太方便 ...

  3. CSS中常见的6种文本样式

    前面的话 CSS文本样式是相对于内容进行的样式修饰.由于在层叠关系中,内容要高于背景.所以文本样式相对而言更加重要.有些人对文本和字体样式之间的不同不太了解,简单地讲,文本是内容,而字体则用于显示这个 ...

  4. 【原创】Newlife.XCode的常见功能使用(一)查询与数据初始化

            本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html Newlife XCode组件相关文章目录:http://www ...

  5. MemCache分布式缓存的一个bug

    Memcached分布式缓存策略不是由服务器端至支持的,多台服务器之间并不知道彼此的存在.分布式的实现是由客户端代码(Memcached.ClientLibrary)通过缓存key-server映射来 ...

  6. spring源码分析之spring注解@Aspect是如何工作的?

    1.@Aspect 在xml定义:<aop:aspectj-autoproxy />,其定义在http://www.springframework.org/schema/aop/sprin ...

  7. 关注经典:CSS Awards 获奖网站作品赏析《第一季》

    每天都有很多新的网站推出,其中不乏一些设计极其优秀的作品.这个系列的文章,我为大家挑选了2012年赢得 CSS Awards 大奖的50个最佳网站.这些鼓舞人心的网站作品代表了网页设计的最高水平,相信 ...

  8. android中AVD的使用

    AVD路径设置 前面提到,不管用Eclipse还是从命令行创建Android Emulator时,相应的文件是被放置到 “C:\Documents and Settings\Administrator ...

  9. 【Swift学习】Swift编程之旅---集合类型之数组(六)

    swift提供了3种主要的集合类型,array,set,dictionary.本节介绍array. 数组是存储有序的相同类型的集合,相同的值可以多次出现在不同的位置. 注意: swift的Array类 ...

  10. ASP.NET MVC案例——————拦截器

    摘要      本文将对“MVC公告发布系统”的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 一个小难题      我们继续完善“MVC公告发布系统”, ...