Java小实例——简易文件上传器

 

  •      最近跟着某网站学习了一个小项目,因为白天有课,所以都是晚上写的,今天把它完成了。
  •      项目主要是实现一个文件上传器,通过客户端的登陆,把本地文件上传到服务器的数据库(本地的)。
  •      首先建两个表如下:
  •      
    一个文件信息表
    CREATE TABLE `fileinfo` (
      `Fname` char(50) NOT NULL,
      `FInfo` blob NOT NULL,
      `FId` int(10) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`FId`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
    
    一个用户信息表
    CREATE TABLE `user` (
      `username` char(25) NOT NULL,
      `password` char(25) NOT NULL,
      `useid` int(10) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`useid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;
  • User类
    package fileUpload;
    
    import java.io.Serializable;
    
    /*
     * 用户实体类
     */
    public class User implements Serializable{
    	private static final long serialVersionUID = -7279093338433393181L;
    	private int useid;//用户编号
    	private String usename;//用户名
    	private String usepsd;//用户密码
    	
    	public User(){	
    	}
    	public User(String usename,String usepsd){
    		super();
    		this.usename = usename;
    		this.usepsd = usepsd;
    	}
    	public User(int useid,String usename,String usepsd){
    		super();
    		this.useid = useid;
    		this.usename = usename;
    		this.usepsd = usepsd;
    	}
    	public int getUseid() {
    		return useid;
    	}
    	public void setUseid(int useid) {
    		this.useid = useid;
    	}
    	public String getUsename() {
    		return usename;
    	}
    	public void setUsename(String usename) {
    		this.usename = usename;
    	}
    	public String getUsepsd() {
    		return usepsd;
    	}
    	public void setUsepsd(String usepsd) {
    		this.usepsd = usepsd;
    	}
    	
    	
    }
    
  •  
    UserService类
    package fileUpload;
    
    /**
     * 用户登陆与注册操作类
     */
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class UserService {
    	private Connection conn = null;
    	private PreparedStatement ptmt = null;
    	private ResultSet rs = null;
    
    	// 用户登录
    	public boolean login(User user) {
    		String url = "jdbc:mysql://localhost:3306/fileupload";// 数据库连接字符串
    		String sql = "select * from user where username=? and password=?";
    		try {
    			Class.forName("org.gjt.mm.mysql.Driver").newInstance();
    			conn = DriverManager.getConnection(url, "root", "1995520");
    			ptmt = conn.prepareStatement(sql);
    			ptmt.setString(1, user.getUsename());
    			ptmt.setString(2, user.getUsepsd());
    			rs = ptmt.executeQuery();
    			if (rs.next()) {
    				return true;
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				rs.close();
    				ptmt.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		return false;
    	}
    
    	//用户注册
    	public boolean register(User user){
    		System.out.println("hello");
    		String url = "jdbc:mysql://localhost:3306/fileupload";// 数据库连接字符串
    		String sql = "insert into user(username,password) values (?,?)";
    		try {
    			Class.forName("org.gjt.mm.mysql.Driver").newInstance();
    			conn = DriverManager.getConnection(url, "root", "1995520");
    			ptmt = conn.prepareStatement(sql);
    			ptmt.setString(1, user.getUsename());
    			ptmt.setString(2, user.getUsepsd());
    			ptmt.executeUpdate();
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    			return false;
    		} finally {
    			try {
    				//rs.close();
    				ptmt.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		return  true;
    	}
    }
    
    FileIofo类
    package fileUpload;
    
    import java.io.Serializable;
    
    /*
     * 文件实体类
     */
    public class FileInfo implements Serializable{
    	private static final long serialVersionUID = 2554622626228481455L;
    	private int fid;//文件编号
    	private String fname;//文件名
    	private byte[] fcontent;//文件内容
    	
    	public FileInfo(){
    		
    	}
    	public FileInfo(String fname,byte[] fcontent){
    		super();
    		this.fname = fname;
    		this.fcontent = fcontent;
    	}
    	public FileInfo(int fid,String fname,byte[] fcontent){
    		super();
    		this.fid = fid;
    		this.fname = fname;
    		this.fcontent = fcontent;
    	}
    	public int getFid() {
    		return fid;
    	}
    	public void setFid(int fid) {
    		this.fid = fid;
    	}
    	public String getFname() {
    		return fname;
    	}
    	public void setFname(String fname) {
    		this.fname = fname;
    	}
    	public byte[] getFcontent() {
    		return fcontent;
    	}
    	public void setFcontent(byte[] fcontent) {
    		this.fcontent = fcontent;
    	}
    	
    	
    }
    
  •  
    FileService类
    package fileUpload;
    /**
     * 文件上传操作类
     */
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    
    public class FileService {
    	private Connection conn = null;
    	private PreparedStatement ptmt = null;
    	
    	//将文件保存到数据库中
    	public boolean save(FileInfo file){
    		String url = "jdbc:mysql://localhost:3306/fileupload";//数据库连接字符串
    		String sql = "insert into fileinfo(Fname,Finfo) value (?,?)";
    		try{
    			Class.forName("org.gjt.mm.mysql.Driver").newInstance();
    			conn = DriverManager.getConnection(url, "root", "1995520");
    			ptmt = conn.prepareStatement(sql);
    			ptmt.setString(1, file.getFname());
    			ptmt.setBytes(2,file.getFcontent());
    			ptmt.executeUpdate();
    		}catch(Exception e){
    			e.printStackTrace();
    			return false;
    		}finally{
    			try {
    				ptmt.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		return true;
    	}
    }
    
  •  
    package fileUpload;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    /*
     * 启动服务器类
     */
    public class StartServer {
    	@SuppressWarnings("resource")
    	public static void main(String[] args){
    	try {
    		// 1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
    		ServerSocket serverSocket = new ServerSocket(8888);
    		Socket socket = null;
    		System.out.println("服务器已启动,等待客户端的连接...");
    		//循环监听等待客户端的连接
    		while (true) {
    			// 2.调用accept()方法开始监听,等待客户端的连接
    			socket = serverSocket.accept();
    			//创建一个新的线程
    			ServerThread serverThread = new ServerThread(socket);
    			//启动线程
    			serverThread.start();
    		}
    
    	} catch (IOException e) {
    		// TODO 自动生成的 catch 块
    		e.printStackTrace();
    	}
    }
    }
    
  •  
    package fileUpload;
    
    import java.io.IOException;
    
    /**
     *  启动客户端类
     */
    public class StartClient {
    	public static void main(String[] args) throws IOException{
    		SocketClient client = new SocketClient();
    		client.showMainMenu();//显示主菜单
    	}
    
    }
    
  •  
    package fileUpload;
    
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    
    import javax.swing.JOptionPane;
    
    /*
     * 服务器端多线程处理类
     */
    public class ServerThread extends Thread {
    	static Socket socket = null;
    	private static ObjectInputStream ois = null;// 对象输入流
    	private ObjectOutputStream oos = null;// 对象输出流
    	private UserService us = new UserService();// 用户业务对象
    	private FileService fs = new FileService();// 文件业务对象
    
    	// 通过构造方法,初始化socket
    	public ServerThread(Socket socket) {
    		ServerThread.socket = socket;
    	}
    
    	public void run() {
    		try {
    			ois = new ObjectInputStream(socket.getInputStream());//接收客户端发来的消息
    			oos = new ObjectOutputStream(socket.getOutputStream());//用来向客户端发送消息
    			CommandTransfer transfer = (CommandTransfer) ois.readObject(); // 读取客户端发送到服务器的指令操作
    			transfer = execute(transfer); // 执行客户端送到服务器的指令操作
    			oos.writeObject(transfer);// 响应客户端
    		} catch (IOException | ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    
    	/*
    	 * 执行客户端发送到服务器的指令操作
    	 */
    	private CommandTransfer execute(CommandTransfer transfer) {
    		String cmd = transfer.getCmd();// 获取当前操作的指令
    		if (cmd.equals("login")) { // 用户登录
    			User user =(User)transfer.getData();
    			boolean flag = us.login(user);
    			if(flag)
    				JOptionPane.showMessageDialog(null, "登陆成功!");
    			transfer.setFlag(flag);
    			if(flag){//判断登陆是否成功
    				transfer.setResult("登陆成功!");
    				
    			}else{
    				transfer.setResult("用户名或密码不正确,请重新登陆!");
    			}
    			
    		}else if(cmd.equals("register")){//用户注册
    			User user = (User) transfer.getData();
    			us.register(user);//注册用户
    			boolean flag = us.register(user);
    			if(flag)
    				JOptionPane.showMessageDialog(null, "注册成功!");
    			transfer.setFlag(flag);
    			if(flag){
    				transfer.setResult("注册成功!");
    			}else{
    				transfer.setResult("注册失败!");
    			}
    		}else if(cmd.equals("uploadFile")){
    			FileInfo file =(FileInfo)transfer.getData();
    			fs.save(file);
    			boolean flag = fs.save(file);
    			if(flag)
    				JOptionPane.showMessageDialog(null, "上传成功!");
    			transfer.setFlag(flag);
    			if(flag){
    				transfer.setResult("上传成功!");
    			}else{
    				transfer.setResult("上传失败!");
    			}
    			
    		}
    		return transfer;
    	}
    }
  •  
    package fileUpload;
    
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.Scanner;
    /**
     *  主菜单类
     */
    public class SocketClient {
    	Scanner input = new Scanner(System.in);
    	private static Socket socket = null;// 客户端Socket
    
    	// 主菜单
    	public void showMainMenu() throws IOException {
    		System.out.println("******欢迎使用xx文件上传器******");
    		System.out.println("1.登录\n2.注册\n3.退出");
    		System.out.println("****************************");
    		System.out.println("请选择:");
    		int choice = input.nextInt();// 获取用户的选择
    		socket = new Socket("localhost", 8888);
    		switch (choice) {
    		case 1:
    			showLogin();// 登录
    			break;
    		case 2:
    			showRegister();// 注册
    			break;
    		case 3:
    			System.out.println("欢迎你对本系统的支持");
    			System.exit(0);
    		default:
    			System.out.println("输入有误!");
    			System.exit(0);
    		}
    
    	}
    
    	// 用户注册
    	private void showRegister() throws IOException {
    		User user = new User();
    		CommandTransfer transfer = new CommandTransfer();
    		int count = 0;// 登陆次数
    		while (true) {
    			count++;
    			if (count > 3) {
    				System.out.println("你已连续3次登陆失败,程序退出!");
    				System.exit(0);
    			}
    			System.out.print("请输入用户名:");
    			user.setUsename(input.next());
    			System.out.print("请输入密码:");
    			user.setUsepsd(input.next());
    			System.out.print("请再次输入密码:");
    			String rePassword = input.next();
    			if (!user.getUsepsd().equals(rePassword)) {
    				System.out.println("两次输入的密码不一致!");
    				System.out.println("**********************");
    				continue;
    			}
    			transfer.setCmd("register");
    			transfer.setData(user);
    
    			try {
    
    				sendData(transfer);// 将数据发送到服务器
    				transfer = getData();// 获取服务器返回的数据
    				System.out.println(transfer.getResult());// 输出显示结果
    				System.out.println("*****************************");
    				if (transfer.isFlag()) {
    					break;// 如果注册成功,则不再重复执行注册
    				}
    
    			} catch (UnknownHostException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			} finally {
    			}
    		}
    		showLogin();// 注册成功后显示登陆
    	}
    
    	// 获得服务器的数据
    	public static CommandTransfer getData() throws IOException {
    		// TODO Auto-generated method stub
    		ObjectInputStream ois = null;
    		CommandTransfer res = null;
    		try {
    			if(socket.isClosed())
    			socket = new Socket("localhost", 8888);
    			ois = new ObjectInputStream(socket.getInputStream());
    
    			res = (CommandTransfer) ois.readObject();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} finally {
    			if (ois != null) {
    				try {
    					ois.close();
    					//socket.close();
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		}
    		return res;
    	}
    
    	/*
    	 * 上传文件
    	 */
    	private void showUploadFile() throws IOException {
    		System.out.println("请输入上传文件的绝对路径:");
    		String path = input.next();
    		FileInfo file = null;
    		FileInputStream fis = null;
    		BufferedInputStream bis = null;
    		String fname = path.substring(path.lastIndexOf("/") + 1);
    		try {
    			fis = new FileInputStream(path);
    			byte[] fcontent = new byte[fis.available()];
    			bis = new BufferedInputStream(fis);
    			bis.read(fcontent);
    			file = new FileInfo(fname, fcontent);
    			
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} finally {
    			bis.close();
    			fis.close();
    		}
    		CommandTransfer transfer = new CommandTransfer();
    		transfer.setCmd("uploadFile");
    		transfer.setData(file);
    		try {
    			sendData(transfer);// 将数据发送到服务器
    			transfer = getData();// 获取服务器返回的数据
    			System.out.println(transfer.getResult());// 输出显示结果
    		} catch (UnknownHostException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    		}
    	}
    
    	// 向服务器发送数据
    	public static void sendData(CommandTransfer cmd) throws IOException {
    		// TODO Auto-generated method stub
    
    		ObjectOutputStream oos = null;
    		try {
    			if(socket.isClosed())//判断socket是否被关闭,如果关闭,就打开
    			socket = new Socket("localhost", 8888);
    			oos = new ObjectOutputStream(socket.getOutputStream());
    			oos.writeObject(cmd);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	// 用户登陆
    	private void showLogin() throws IOException {
    		User user = new User();
    		CommandTransfer transfer = new CommandTransfer();
    		while (true) {
    			System.out.print("请输入用户名:");
    			user.setUsename(input.next());
    			System.out.print("请输入密码:");
    			user.setUsepsd(input.next());
    			transfer.setCmd("login");
    			transfer.setData(user);
    			try {
    				sendData(transfer);// 将数据发送到服务器
    				transfer = getData();// 获取服务器返回的数据
    				System.out.println(transfer.getResult());// 输出显示结果
    				System.out.println("*****************************");
    				if (transfer.isFlag()) {
    					break;// 如果注册成功,则不再重复执行注册
    				}
    
    			} catch (UnknownHostException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			} finally {
    			}
    		}
    		showUploadFile();// 登陆成功后进行文件的上传
    
    	}
    
    }
    

  • 运行效果图如下:


  • 文件已保存到数据库中了,这个项目对于想练练Socket通信和mysql的朋友来说,还是挺不错的。



     

 

     

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值