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

注意表单的配置属性:

<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. sql语句执行顺序

    首先来一张朋友传给我的图 FORM: 对FROM的左边的表和右边的表计算笛卡尔积.产生虚表VT1 ON: 对虚表VT1进行ON筛选,只有那些符合<join-condition>的行才会被记 ...

  2. C++标准库vector类型详解

    Vector简介 vector是定义在C++标准模板库,它是一个多功能.能够操作多种数据结构和算法的模板类(关于模板类我们后面会介绍,如何创建自己的模板类).vector是一个容器,能够像容器一样存放 ...

  3. SQL Server 错误日志收缩(ERRORLOG)

    一.基础知识 默认情况下,错误日志位于 : C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\ERRORLOG 和ERRORLOG.n 文 ...

  4. KendoUI系列:TreeView

    1.加载本地数据 <link href="@Url.Content("~/Content/kendo/2014.1.318/kendo.common.min.css" ...

  5. 【WP开发】使用磁倾仪

    磁倾仪,也叫倾斜仪,主要用来检测手机设备在各个轴上旋转的角度.注意,磁倾仪与陀螺仪的差异,陀螺仪的关注点是旋转的角速度,它并不关注角度,只注重速度.而磁倾仪的读数就是设备倾斜的角度. 不管是使用重力感 ...

  6. OpenCascade Primitives BRep - Sphere

    OpenCascade Primitives BRep - Sphere eryar@163.com Abstract. BRep is short for Boundary Representati ...

  7. 用命令行编译java并生成可执行的jar包

    用命令行编译java并生成可执行的jar包 1.编写源代码. 编写源文件:CardLayoutDemo.java并保存,例如:I:\myApp\CardLayoutDemo.java.程序结构如下: ...

  8. 基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作

    在前面介绍了很多篇相关的<Bootstrap开发框架>的系列文章,这些内容基本上覆盖到了我这个Bootstrap框架的各个主要方面的内容,总体来说基本达到了一个稳定的状态,随着时间的推移可 ...

  9. Android基于mAppWidget实现手绘地图(四)--如何附加javadoc

    如何把javadoc添加到代码库中? How to attach javadoc to the library? 项目属性——>Java Build Path——>Libraries.选择 ...

  10. mysql管理知识点

    mysql是完全开原的关系型数据库,在web后端用的比较多,经典的架构有LAMP,LNMP,其中的M就指mysql. 一:安装 新版的linux里默认的已经不是mysql,而是他的一个分支mariad ...