在网站开发中,文件上传和下载是经常用到的,我们给大家讲解一个文件上传和下载的案例。
比如我们在注册一个用户的时候,往往需要上传一个用户的头像。
Struts文件上传原理示意图:
register.jsp
<h5>注册用户</h5>
<!-- 如果我们的表单有文件控件,则需要重新指定 表单的编码方式-->
<form action="/strutsFileupAndDown/register.do" method="post" enctype="multipart/form-data"/>
用户名:<input type="text" name="username"></br>
密码:<input type="password" name="password"></br>
头像:<input type="file" name="myphoto"/></br>
<input type="submit" value="注册"/>
</form>
ActionForm.java
public class UserForm extends ActionForm {
private String username;
private String password;
private FormFile myphoto;
Set/get(方法);
}
ok.jsp
<h5>注册成功</h5>
<a href="#">点击查看用户列表</a>
RegisterAction.javapublic class RegisterAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {
UserForm userForm = (UserForm) form;
<span style="background-color: rgb(204, 204, 204);"><span style="color:#009900;"> //取出用户名和密码</span></span>
String name=userForm.getUsername();
String pass=userForm.getPassword();
//取出文件
FormFile formFile=userForm.getMyphoto();
//通过formFile我们可以获取关于用户上传文件的各种信息
String filename=formFile.getFileName();
int filesize=formFile.getFileSize();
//取出输入流
InputStream is=null;
OutputStream os=null;
try {
is=formFile.getInputStream();
//得到一个输出流-->文件
//1.得到file文件夹上传到tomcat服务器后的绝对路径
String keepFilePath=this.getServlet().getServletContext().getRealPath("/images");
os=new FileOutputStream(keepFilePath+"\\"+MyTools.newFilename(filename));
//读取文件并写出到服务器images
int len=0;
//做一个缓存buffer
byte[]bytes=new byte[1024];
//循环处理
while((len=is.read(bytes))>0){
//读一点,写出一点
os.write(bytes, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
is.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
解决文件上传的细节问题:
1.覆盖文件的问题?
我们为了防止第二次上传的文件名相同为覆盖了
思路:
先看看有没有该文件,然后如果有了,则给以后上传的文件取一个名字,
为了防止新取文件名称重复(年+月+日+分+秒+毫秒)还有一种方法uuid
解决方法:
思路:编写一个工具类,可以生成一个不重复的文件名,然后再保存
public class MyTools {
public static String getNewFileName(String fileName){
String uuid=UUID.randomUUID().toString();
int beginIndex=fileName.lastIndexOf(".");
String newFilename=uuid+fileName.substring(beginIndex, fileName.length());
return newFilename;
}
}
然后在Action中调用这个方法
<span style="color:#009900;">//1.得到file文件夹上传到tomcat服务器后的绝对路径</span>
String keepFilePath=this.getServlet().getServletContext().getRealPath("/images");
os=new FileOutputStream(keepFilePath+"\\"+MyTools.getNewFileName(filename));
2.如果是中文名怎么办?
2.1首先使用过滤器
新建一个过滤器,过滤器建完后还要在web.xml中手动配置,把之前配置的全删掉,不然过滤器默认只是普通的Servlet而已,所以我们要重新配置
public class MyFilter1 extends HttpServlet implements Filter {
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
arg0.setCharacterEncoding("utf-8");
arg2.doFilter(arg0, arg1);
}
public void init(FilterConfig arg0) throws ServletException {
}
}
web.xml中配置过滤器
<!-- 配置我们的过滤器 -->
<filter>
<filter-name>MyFilter1</filter-name>
<filter-class>com.hl.filter.MyFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter1</filter-name>
<url-pattern>/*</url-pattern>
<pre name="code" class="html"></filter-mapping>