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

注意表单的配置属性:

<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. Python的闭包

    Python的闭包 闭包概念都是一样的,实现机制一样,看看下面的代码是不是和javascript很像 def generate_counter(): cnt = [0] def count_one() ...

  2. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

    1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...

  3. Android listview addHeaderView 和 addFooterView 详解

    addHeaderView()方法:主要是向listView的头部添加布局addFooterView()方法:主要是向listView的底部添加布局 需要注意的是添加布局的时候应该添加从父容器开始添加 ...

  4. poj 3321 Apple Trie

    /* poj 3321 Apple Trie 这道题的关键是如何将一个树建成一个一维数组利用树状数组来解题! 可以利用dfs()来搞定,我们在对一个节点深搜后,所经过的节点的数目就是该节点的子树的数目 ...

  5. Cocos2d-x 3.2学习笔记(三)学习绘图API

    关于cocos2d-x 3.2 版本的绘图方法有两种 1.使用DrawNode类绘制自定义图形. 2.继承Layer类重写draw()方法. 以上两种方法都可以绘制自定义图形,根据自己的需要选择合适的 ...

  6. Node.js的学习--使用cheerio抓取网页数据

    打算要写一个公开课网站,缺少数据,就决定去网易公开课去抓取一些数据. 前一阵子看过一段时间的Node.js,而且Node.js也比较适合做这个事情,就打算用Node.js去抓取数据. 关键是抓取到网页 ...

  7. Office英语学习好帮手

    Office提供了强大实用的英语学习助手,它可以自动翻译中英文,还可以显示详尽的解释帮助信息,当然标准的发音也是必不可少的.如何启动屏幕取词翻译功能呢?如何让office自动取词并翻译呢?如何收听单词 ...

  8. Linux:文件权限

    Linux:文件权限 1.文件权限 ☆文件所有者 ☆用户组 ☆其他人 ☆ROOT 说明: Linux系统中默认所有系统上的账号与一般身份用户,还有那个root的相关信息记录在/etc/passwd文件 ...

  9. TCP/IP之四书五经[转自2003.12程序员]

    TCP/IP协议是当前广域网和局域网通用的网络协议,因此,基于TCP/IP的编程就格外重要.从应用上来说,现在直接利用C层次Socket API进行TCP/IP编程的人确实越来越少了,各种现成的框架( ...

  10. 实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法

    关于ajax跨域调用WCF服务的方法很多,经过我反复的代码测试,认为如下方法是最为简便的,当然也不能说别人的方法是错误的,下面就来上代码,WCF服务定义还是延用上次的,如: namespace Wcf ...