zoukankan      html  css  js  c++  java
  • 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

    Mysqlnot nullunique在一起自动转为主键

    Create table users_2( 

    Username varchar(64) unique not null,

    Photo varchar(128) not null,

    Photo2 varchar(128) not null

    )

    文件上传action:

     1 /*
     2  * Generated by MyEclipse Struts
     3  * Template path: templates/java/JavaClass.vtl
     4  */
     5 package com.xidian.struts.action;
     6 
     7 import java.io.FileNotFoundException;
     8 import java.io.FileOutputStream;
     9 import java.io.IOException;
    10 import java.io.InputStream;
    11 import java.io.OutputStream;
    12 
    13 import javax.servlet.http.HttpServletRequest;
    14 import javax.servlet.http.HttpServletResponse;
    15 
    16 import org.apache.struts.action.Action;
    17 import org.apache.struts.action.ActionForm;
    18 import org.apache.struts.action.ActionForward;
    19 import org.apache.struts.action.ActionMapping;
    20 import org.apache.struts.upload.FormFile;
    21 
    22 import com.xidian.domain.Users;
    23 import com.xidian.service.UserService;
    24 import com.xidian.struts.form.UserForm;
    25 import com.xidian.utils.Mytools;
    26 
    27 /** 
    28  * MyEclipse Struts
    29  * Creation date: 08-23-2016
    30  * 
    31  * XDoclet definition:
    32  * @struts.action
    33  */
    34 public class RegisterAction extends Action {
    35     
    36     public ActionForward execute(ActionMapping mapping, ActionForm form,
    37             HttpServletRequest request, HttpServletResponse response) {
    38         // TODO Auto-generated method stub
    39         UserForm userForm=(UserForm)form;
    40         String name=userForm.getName();
    41         FormFile formFile=userForm.getMyphoto();
    42         //通过formFile我们可以获取用户上传文件的各种信息
    43         String filename=formFile.getFileName();
    44         int fileSize=formFile.getFileSize();
    45         String NewFileName=Mytools.getNewFileName(filename);
    46         System.out.println(NewFileName+""+fileSize);
    47         //获取输入流
    48         InputStream is=null;
    49         OutputStream os=null;
    50        try {
    51          is=formFile.getInputStream();
    52          //得到一个输出流->文件
    53          //1.得到file文件夹上传到tomcat服务器的绝对路径
    54          String saveFilePath=this.getServlet().getServletContext().getRealPath("/file");
    55          System.out.println("saveFilePath="+saveFilePath);
    56          os=new FileOutputStream(saveFilePath+"\"+NewFileName);
    57          //读取文件并写出到服务器路径file
    58          int len=0;
    59          //做一个buffer缓存
    60          byte[] bytes=new byte[1024];
    61          //循环处理
    62          while((len=is.read(bytes))>0){
    63              //读一点写一点
    64              os.write(bytes, 0, len);
    65          }    
    66          //如果用户的头像上传到数据库中,我们就保存到数据库中
    67          UserService userService=new UserService();
    68          Users user= new Users();
    69          user.setUsername(name);
    70          user.setPhoto(NewFileName);  //保存新的文件名
    71          user.setPhoto2(filename);
    72         if(userService.addUser(user)){
    73             return mapping.findForward("ok");
    74         }
    75                                          
    76        } catch (Exception e) {        
    77         e.printStackTrace();
    78          
    79        } finally{
    80            try {
    81                os.close();
    82             is.close();
    83         } catch (IOException e) {
    84             // TODO Auto-generated catch block
    85             e.printStackTrace();
    86         }
    87        }
    88        
    89        return mapping.findForward("err");
    90       
    91     }
    92 }
    View Code

    文件下载action:

     1 /*
     2  * Generated by MyEclipse Struts
     3  * Template path: templates/java/JavaClass.vtl
     4  */
     5 package com.xidian.struts.action;
     6 
     7 import java.io.FileInputStream;
     8 import java.io.FileNotFoundException;
     9 import java.io.IOException;
    10 import java.io.OutputStream;
    11 import java.io.UnsupportedEncodingException;
    12 
    13 import javax.servlet.http.HttpServletRequest;
    14 import javax.servlet.http.HttpServletResponse;
    15 
    16 import org.apache.struts.action.Action;
    17 import org.apache.struts.action.ActionForm;
    18 import org.apache.struts.action.ActionForward;
    19 import org.apache.struts.action.ActionMapping;
    20 
    21 import com.xidian.domain.Users;
    22 import com.xidian.service.UserService;
    23 
    24 public class DownloadAction extends Action {
    25 
    26     public ActionForward execute(ActionMapping mapping, ActionForm form,
    27             HttpServletRequest request, HttpServletResponse response) {        
    28 
    29         //获取用户的名称
    30         String username=request.getParameter("user");
    31         //获取user对象
    32         UserService userService=new UserService();
    33         Users user=userService.getUser(username);
    34             
    35         response.setContentType("text/html;charset=utf-8");
    36         
    37             //如果文件名有中文,需要对其进行url编码    
    38         String name=null;            
    39                             
    40             try {
    41                 response.setHeader("Content-Disposition", "attachment;filename="+ java.net.URLEncoder.encode(user.getPhoto2(),"utf-8"));
    42             } catch (UnsupportedEncodingException e1) {
    43                 // TODO Auto-generated catch block
    44                 e1.printStackTrace();
    45             }
    46         
    47         //下载文件
    48         //1.先获取到要下载文件的绝对路径
    49         String filePath=this.getServlet().getServletContext().getRealPath("/file");
    50         String fileAllPath=filePath+"\"+user.getPhoto();
    51         FileInputStream fis=null;
    52         OutputStream os=null;
    53         byte[] buffer=new byte[1024];
    54         int len=0;
    55         try {
    56             
    57             fis=new FileInputStream(fileAllPath);
    58             os=response.getOutputStream();
    59             while((len=fis.read(buffer))>0){
    60                 os.write(buffer, 0, len);
    61             }
    62             
    63         } catch (Exception e) {
    64             
    65             e.printStackTrace();
    66         } finally{
    67             try {
    68                 os.close();
    69                 fis.close();
    70             } catch (IOException e) {
    71                 // TODO Auto-generated catch block
    72                 e.printStackTrace();
    73             }
    74             
    75         }
    76         
    77         return mapping.findForward("back");
    78     }
    79 }
    View Code

    疑问?

    在文件下载的时候含中文名字的文件不能下载,查找方法用

    response.setHeader("Content-Disposition", "attachment;filename="+ java.net.URLEncoder.encode(user.getPhoto2(),"utf-8"));

    对获取到的文件名进行编码,并没能解决,报出错误:

    java.lang.NullPointerException java.net.URLEncoder.encode

    没能找出原因。

    UserService代码:

     1 package com.xidian.service;
     2 
     3 import java.sql.ResultSet;
     4 import java.sql.SQLException;
     5 import java.util.ArrayList;
     6 
     7 
     8 import com.xidian.domain.Users;
     9 import com.xidian.utils.SqlHelper;
    10 
    11 public class UserService {
    12     public Users getUser(String username){
    13         Users user=new Users();
    14         String sql="select * from users_2 where username=?";
    15         String[] parameters={username};
    16         ResultSet rs=SqlHelper.executeQuery(sql, parameters);
    17         try {
    18             if(rs.next()){
    19                 
    20                 user.setUsername(rs.getString(1));
    21                 user.setPhoto(rs.getString(2));
    22                 user.setPhoto2(rs.getString(3));
    23                 return user;
    24             }
    25         } catch (SQLException e) {
    26             // TODO Auto-generated catch block
    27             e.printStackTrace();
    28         }
    29         return user;
    30     }
    31     
    32     public boolean addUser(Users user){
    33         boolean b=true;
    34         String sql="insert into users_2 values (?,?,?)";
    35         String parameters[]={user.getUsername(),user.getPhoto(),user.getPhoto2()};
    36         try{
    37         SqlHelper.executeUpdate(sql, parameters);
    38         }catch(Exception e){
    39             b=false;
    40         }
    41         return b;
    42     }
    43     
    44     public ArrayList getUserList(){
    45         String sql="select * from users_2";
    46         ResultSet rs=SqlHelper.executeQuery(sql, null);
    47         ArrayList al=new ArrayList();
    48         try {
    49             while(rs.next()){
    50                 Users users=new Users();
    51                 users.setUsername(rs.getString(1));
    52                 users.setPhoto(rs.getString(2));
    53                 users.setPhoto2(rs.getString(3));
    54                 al.add(users);
    55             }
    56             return al;
    57         } catch (SQLException e) {
    58             // TODO Auto-generated catch block
    59             e.printStackTrace();
    60             return al;
    61         }
    62         
    63     }
    64 
    65 }
    View Code
  • 相关阅读:
    Nginx日志管理
    Nginx负载均衡
    Nginx 缓存
    Nginx代理服务器
    Nginx搭建 Web服务
    Nginx HTTP模块
    洛谷P1012拼数
    洛谷 P1876 开灯
    洛谷P2084 进制转化
    关于typedef的用法
  • 原文地址:https://www.cnblogs.com/xiangkejin/p/5801032.html
Copyright © 2011-2022 走看看