java:struts框架(网路静态U盘项目)

1.网络静态U盘项目:

   struts.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <constant name="struts.multipart.maxSize" value="209715200"></constant>
    <package name="udisk" extends="struts-default">
        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>
        
        <!-- 配置struts2的异常映射 -->
        <global-exception-mappings>
            <exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
        </global-exception-mappings>

        <action name="user-*" class="cn.zzsxt.udisk.action.UserinfoAction" method="{1}">
            <result type="redirect">/login.jsp</result>
            <result name="login" type="redirect">/login.jsp</result>
            <result name="list" type="redirectAction">file-list</result>
        </action>
        <action name="file-*" class="cn.zzsxt.udisk.action.FileinfoAction" method="{1}">
            <result name="list">/list.jsp</result>
            <result name="success" type="redirectAction">file-list</result>
            <!-- 下载 -->
            <result type="stream" name="download">
                <!-- inputName="输入流的名称",回掉action中getInputStream()方法获取输入流 -->
                <param name="inputName">inputStream</param>
                <!--contentType="文件类型" application/octet-stream代表对下载类型不限制  -->
                <param name="contentType">application/octet-stream</param>
                <!-- attachment:以附件方式保存 filename="保存的文件名称" ${fileName}获取action中fileName属性的值 -->
                <param name="contentDisposition">attachment;filename=${fileName}</param>
            </result>
        </action>
    </package>
</struts>

  FileinfoAction:

package cn.zzsxt.udisk.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import cn.zzsxt.udisk.model.Fileinfo;
import cn.zzsxt.udisk.model.Userinfo;
import cn.zzsxt.udisk.service.IFileinfoService;
import cn.zzsxt.udisk.service.impl.FileinfoServiceImpl;

public class FileinfoAction extends ActionSupport implements SessionAware,ServletRequestAware{
    private IFileinfoService fileinfoService  =new FileinfoServiceImpl();
    private Map<String,Object> session;
    private HttpServletRequest request;
    private File[] upload;//接收上传的文件信息
    private String[] uploadFileName;//接收上传文件的名称
    private int fileId;
    private String fileCode;//提取码
    private String fileName;//文件名称
    //结合stream结果视图完成下载功能
    private InputStream inputStream;
    
    public File[] getUpload() {
        return upload;
    }
    public void setUpload(File[] upload) {
        this.upload = upload;
    }
    public String[] getUploadFileName() {
        return uploadFileName;
    }
    public void setUploadFileName(String[] uploadFileName) {
        this.uploadFileName = uploadFileName;
    }
    
    public int getFileId() {
        return fileId;
    }
    public void setFileId(int fileId) {
        this.fileId = fileId;
    }
    
    public String getFileCode() {
        return fileCode;
    }
    public void setFileCode(String fileCode) {
        this.fileCode = fileCode;
    }
    
    public InputStream getInputStream() {
        return inputStream;
    }
    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }
    
    public String getFileName() {
        return fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    /**
     * 查询用户的文件列表
     * @return
     * @throws Exception
     */
    public String list() throws Exception {
        //从session中获取用户信息
        Userinfo user = (Userinfo)session.get("loginUser");
        if(user!=null){
            int userId = user.getUserId();
            List<Fileinfo> list = fileinfoService.findFileinfoByUserId(userId);
            request.setAttribute("list", list);
        }
        return "list";
    }
    /**
     * 文件的上传
     * @return
     */
    public String upload() throws Exception{
        //获取登陆用户信息
        Userinfo user = (Userinfo)session.get("loginUser");
        String path = request.getServletContext().getRealPath("/");
        Fileinfo[] files = new Fileinfo[upload.length];
        for(int i=0;i<files.length;i++){
            Fileinfo file = new Fileinfo();
            file.setFileName(uploadFileName[i]);//设置文件名称
            file.setFileSize(upload[i].length());//设置文件大小
            file.setFilePath(path+"upload\"+user.getUserName()+"\"+uploadFileName[i]);
            file.setUserId(user.getUserId()); //file.setUserinfo(user);
            files[i]=file;
        }
        int count = fileinfoService.uploadFile(files, user, path, upload);
        if(count>0){
            return this.SUCCESS;
        }
        return this.ERROR;
    }

    /**
     * 删除文件
     * @return
     * @throws Exception
     */
    public String delete() throws Exception{
        int count = fileinfoService.removeFile(fileId);
        if(count>0){
            return this.SUCCESS;
        }
        return this.ERROR;
    }
    
    /**
     * 下载
     * @return
     * @throws Exception
     */
    public String download() throws Exception{
        //根据提取码获取文件信息
        Fileinfo downloadFileinfo = fileinfoService.findFileinfoByFileCode(fileCode);
        //获取文件保存的真实路径
        String filePath = downloadFileinfo.getFilePath();
        inputStream = new FileInputStream(filePath);
        //解决下载时中文名称乱问问题
        fileName =  new String(downloadFileinfo.getFileName().getBytes("UTF-8"),"iso-8859-1");
        return "download";
    }
    
    @Override
    public void setSession(Map<String, Object> arg0) {
        this.session=arg0;
    }

    @Override
    public void setServletRequest(HttpServletRequest arg0) {
        this.request=arg0;
    }
}

  

  UserinfoAction:

package cn.zzsxt.udisk.action;

import java.util.Map;

import javax.servlet.ServletContext;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

import cn.zzsxt.udisk.model.Userinfo;
import cn.zzsxt.udisk.service.IUserinfoService;
import cn.zzsxt.udisk.service.impl.UserinfoServiceImpl;

public class UserinfoAction extends ActionSupport implements SessionAware{
    private Userinfo user;
    private IUserinfoService uesrinfoService = new UserinfoServiceImpl();
    private Map<String,Object> session;
    public Userinfo getUser() {
        return user;
    }

    public void setUser(Userinfo user) {
        this.user = user;
    }
    /**
     * 注册
     * @return
     * @throws Exception
     */
    public String doRegister() throws Exception {
        //获取服务器的upload目录
        ServletContext servletContext = ServletActionContext.getServletContext();
        String path =  servletContext.getRealPath("/upload");
        int count = uesrinfoService.doRegister(user,path);
        if(count>0){
            return this.SUCCESS;
        }
        return this.ERROR;
    }
    
    public String doLogin() throws Exception {
        Userinfo loginUser = uesrinfoService.doLogin(user);
        if(loginUser!=null){
            //将用户信息保持到session中
            session.put("loginUser", loginUser);
            return "list";
        }
        return this.LOGIN;
    }

    @Override
    public void setSession(Map<String, Object> arg0) {
        this.session=arg0;
    }
}

  

  FileinfoServiceImpl:

package cn.zzsxt.udisk.service.impl;

import java.io.File;
import java.util.List;

import org.apache.commons.io.FileUtils;

import cn.zzsxt.udisk.commons.MD5Utils;
import cn.zzsxt.udisk.dao.IFileinfoDao;
import cn.zzsxt.udisk.dao.impl.FileinfoDaoImpl;
import cn.zzsxt.udisk.model.Fileinfo;
import cn.zzsxt.udisk.model.Userinfo;
import cn.zzsxt.udisk.service.IFileinfoService;

public class FileinfoServiceImpl implements IFileinfoService {
    private IFileinfoDao fileinfoDao = new FileinfoDaoImpl();
    @Override
    public List<Fileinfo> findFileinfoByUserId(int userId) {
        return fileinfoDao.findFileinfoByUserId(userId);
    }
    /**
     * 上传文件
     * 1.将文件上传到服务器端
     * 2.将文件信息添加到数据库中
     */
    @Override
    public int uploadFile(Fileinfo[] file, Userinfo user,String path,File[] upload) throws Exception{
        //将文件信息上次到服务器端
        long totalSize=0,freeSize=32*1024*1024,usedSize=0; //此处freeSize初始化设置值,因为第一次进来listFiles()方法一直返回为空,fressSize一直为0,
        //普通用户空间总大小为32M,VIP用户空间总大小128M      最下面判断剩余空间和文件大小,就一直抛异常。 并且要给listFiles()方法后面的循环遍历加一个
        if(user.getUserType()==1){//普通用户            判断是否为空,如果为空执行的话会错误。  服务器每关闭一次,所有数据清空一次,所以没有那个路径,
            totalSize = 32*1024*1024;//总字节数           导致第一次进来listFiles()返回为空
        }else if(user.getUserType()==2){//VIP用户
            totalSize = 128*1024*1024;
        }
        String userDirStr = path+"upload\"+user.getUserName();
        File userDir = new File(userDirStr);//用户上传文件的文件夹
        File[] fs = userDir.listFiles();//获取该目录下的所有文件
        //统计该用户已用空间大小
     if(fs!=null){
   for (File f : fs) {    usedSize+=f.length();    }    freeSize = totalSize-usedSize;//计算剩余空间大小
    }
//统计上传文件的总大小 long uploadTotalSize=0; for(File uploadFile:upload){ long length = uploadFile.length();//上传单文件的大小 if(user.getUserType()==1&&length>1*1024*1024){//普通用户 throw new Exception("普通用户单文大小不能超过1M!"); } if(user.getUserType()==2&&length>2*1024*1024){ throw new Exception("VIP用户单文大小不能超过2M!"); } uploadTotalSize+=length; } //上传文件大于剩余空间,抛出异常 if(uploadTotalSize>freeSize){ throw new Exception("剩余空间不足!"); } int count=0; //上传文件 for(int i=0;i<upload.length;i++){ File uploadFile = upload[i]; Fileinfo f = file[i]; //将文件上传到服务器端 FileUtils.copyFile(uploadFile, new File(userDir,f.getFileName())); //将文件信息添加到数据库中 //对真实路径进行加密 String fileCode = MD5Utils.createMD5(f.getFilePath()); f.setFileCode(fileCode); count = fileinfoDao.addFileinfo(file[i]); } return count; } /** * 移除文件: * 1.从服务器端用户上传目录下移除文件 * 2.从数据库中删除文件信息 */ @Override public int removeFile(int fileId) { //根据文件编号查询文件详情信息 Fileinfo fileinfo = fileinfoDao.findFileinfoById(fileId); String filePath = fileinfo.getFilePath();//获取文件保存的真实路径 File file = new File(filePath); if(file.exists()){ file.delete();//删除文件 } //从数据库中删除文件信息 return fileinfoDao.deleteFileinfo(fileId); } @Override public Fileinfo findFileinfoByFileCode(String fileCode) { return fileinfoDao.findFileinfoByFileCode(fileCode); } }

  

   UserinfoServiceImpl:

package cn.zzsxt.udisk.service.impl;

import java.io.File;

import cn.zzsxt.udisk.commons.MD5Utils;
import cn.zzsxt.udisk.dao.IUserinfoDao;
import cn.zzsxt.udisk.dao.impl.UserinfoDaoImpl;
import cn.zzsxt.udisk.model.Userinfo;
import cn.zzsxt.udisk.service.IUserinfoService;

public class UserinfoServiceImpl implements IUserinfoService {
    private IUserinfoDao userinfoDao = new UserinfoDaoImpl();
    /**
     * 注册需要对密码进行MD5密码
     */
    @Override
    public int doRegister(Userinfo user,String path) {
        String oldPass = user.getUserPass();
        //对用户输入的密码进行加密
        String newPass = MD5Utils.createMD5(oldPass);
        user.setUserPass(newPass);
        //在服务器端创建一个与用户名相同的文件夹,用于保存该用户上次的文件
        File uploadDir = new File(path+"/"+user.getUserName());
        if(!uploadDir.exists())
            uploadDir.mkdirs();
        return userinfoDao.addUser(user);
    }
    
    /**
     * 登陆
     */
    @Override
    public Userinfo doLogin(Userinfo user) {
        //对用户输入的密码进行加密
        String oldPass = user.getUserPass();
        //对用户输入的密码进行加密
        String newPass = MD5Utils.createMD5(oldPass);
        user.setUserPass(newPass);
        return userinfoDao.doLogin(user);
    }

}

  

  

  

原文地址:https://www.cnblogs.com/kuangzhisen/p/7360690.html