文件上传(上传至独立的文件服务器)

文件先上传到web服务器,再在web服务器里面传送到单独的文件服务器上,在web服务器里面建一个表来保存文件路径即可。

@Service  
public class UploadServiceImpl implements UploadService{  
      

    文件服务器地址
    @Value("${upload.file.url}")  
    private String uploadUrl;  
  
    @Value("webdav")  
    private String uploadUsername;  
  
    @Value("webdav")  
    public String uploadPassword;  
      
    @Override  
    public FileInfo uploadFile(MultipartFile multipartFile) {  
          
        //取到文件大小,如果超过指定范围的话就直接返回提醒错误  
        long size = multipartFile.getSize();  
        //获取文件名  
        String fileName = multipartFile.getOriginalFilename();  
        // 获取文件后缀,即文件类型  
        String fileExt = "";  
        if (fileName.contains(".")) {  
            fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();  
        }  
        //设置MD5加密  
        String fileMD5 = md5File(multipartFile);  
  
        //拼接文件路径:/后缀/年/月/日/md5/filename  
        String saveUrl = "/" + fileExt + new SimpleDateFormat("/yyyy/MM/dd/").format(new Date()) + fileMD5 + "/" + multipartFile.getOriginalFilename();  
  
        String location = null;  
        try {  
            location = saveFile(multipartFile, saveUrl);//保存文件操作  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
  
        FileInfo fileInfo = new FileInfo();  
        fileInfo.setAbsoluteUrl(location);  
        fileInfo.setRelativeUrl(saveUrl);  
        fileInfo.setFileMd5(fileMD5);  
        fileInfo.setFileName(fileName);  
        fileInfo.setFileSize(String.valueOf(size));  
        fileInfo.setFileType(fileExt);  
        fileInfo.setCreateAt(DateUtil.date2String(new Date(), DateUtil.DATE_TIME_FORMAT));  
        return fileInfo;  
  
    }  
      
    //MD5加密  
    private String md5File(MultipartFile multipartFile) {  
        try {  
            return MD5.md5(multipartFile.getBytes());  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
      
      
      
    private String saveFile(MultipartFile file, String savePath) throws Exception {  
        // 上传文件,到文件服务器,uploadUrl是在config中配好的,就是给uploadUrl赋值,如果不用那么麻烦的话可以直接把url放进去:upload("http://192.168.102.11/test", uploadUsername, uploadPassword, savePath, file.getBytes());  
        upload(uploadUrl, uploadUsername/*那台服务器的用户名*/, uploadPassword/*那台服务器的密码*/, savePath, file.getBytes());  
        return append(uploadUrl, savePath);  
          
    }  
      
      
    public static void upload(String webDavServer, String webDavUser, String webDavPassword, String remotePath, byte[] bytes) throws IOException {  
  
        if (!webDavServer.endsWith("/")) webDavServer += "/";  
          
        //连接服务器  
        HttpURL hrl = new HttpURL(webDavServer);  
        hrl.setUserinfo(webDavUser, webDavPassword);  
  
        WebdavResource wdr =  new WebdavResource(hrl);  
  
        //make directory if need  
        StringBuffer ssdir = new StringBuffer();  
        // 去除最后一个文件名  
        StringTokenizer t = new StringTokenizer(remotePath.substring(0, remotePath.lastIndexOf("/")), "/");  
        while(t.hasMoreTokens()){  
            String sdir = t.nextToken();  
            ssdir.append(sdir+"/");  
            wdr.mkcolMethod(wdr.getPath() + ssdir );  
        }  
  
        String remoteFile= wdr.getPath() + remotePath;//拼成绝对地址  
        boolean result = wdr.putMethod(remoteFile, bytes);//把文件写进去  
        checkArgument(result, "文件上传出错");//false时会报错,true则为成功  
  
        wdr.close();//最后关闭连接  
  
    }  
      
      
      
    /** 
     * 连接 URL 
     * @param paths 
     * @return 
     */  
    public static String append(String... paths) {  
        List<String> pathList = Lists.newArrayList(paths);  
        PeekingIterator<String> iter = Iterators.peekingIterator(pathList.iterator());  
        StringBuilder urlBuilder = new StringBuilder();  
        while (iter.hasNext()) {  
            String current = iter.next();  
            urlBuilder.append(current);  
            if (!iter.hasNext()) {  
                break;  
            }  
            if (current.endsWith("/") && iter.peek().startsWith("/")) {  
                urlBuilder.deleteCharAt(urlBuilder.length() - 1);  
            } else if (!current.endsWith("/") && !iter.peek().startsWith("/")) {  
                urlBuilder.append("/");  
            }  
        }  
        return urlBuilder.toString();  
    }  
  
}  

(未完待续)

上传至ftp服务器代码如下

public void testFtp1(){
       //创建客户端对象
       FTPClient ftp = new FTPClient();
       InputStream local=null;
       try {
           //连接ftp服务器
           ftp.connect("192.168.80.161", 21);
           //登录
           ftp.login("ftpuser", "1111");
           //设置上传路径
           String path="/home/ftpuser/image";
           //检查上传路径是否存在 如果不存在返回false
           boolean flag = ftp.changeWorkingDirectory(path);
           if(!flag){
               //创建上传的路径  该方法只能创建一级目录,在这里如果/home/ftpuser存在则可创建image
               ftp.makeDirectory(path);
           }
           //指定上传路径
           ftp.changeWorkingDirectory(path);
           //指定上传文件的类型  二进制文件
           ftp.setFileType(FTP.BINARY_FILE_TYPE);
           //读取本地文件
           File file = new File("mm.jpg");
           local = new FileInputStream(file);
           //第一个参数是文件名
           ftp.storeFile(file.getName(), local);
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //关闭文件流
                local.close();
                //退出
                ftp.logout();
                //断开连接
                ftp.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
   }

还有个野路子:

用nfs共享来实现

查看nfs是否安装

#rpm -qa | grep nfs

若没有则安装nfs包

安装NFS(在网上一些文章上说要安装portmap,新的发布版本上已经不需要了)

              sudo yum install nfs-utils

扫描二维码关注公众号,回复: 455255 查看本文章

( 这里可以通过yum list|grep nfs* 来查看软件包里面是否有nfs相关的包)

       安装完之后,可以是rpm -qa|grep nfs进行查看

写服务端配置文件,先mkdir /tmp/nfs_test

服务端/etc/exports文件的配置格式为:

NFS共享目录 NFS客户端地址1(参数1,参数2,参数3......) 客户端地址2(参数1,参数2,参数3......)

NFS共享目录 NFS客户端地址(参数1,参数2,参数3......)

在/etc/exports中添加:

        <输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]

         /tmp/nfs_test *(rw,no_root_squash,insecure)

启动

         systemctl enable nfs-server.service

         systemctl start nfs-server.service

看下是否启动了:

 exportfs

       showmount -e

       showmount -a

在客户端 先安装 nfs设置开机自启动,然后mount到本地目录上

       mount -t nfs 9.151.141.111:/tmp/nfs_test /mnt

       然后可以在/mnt目录里写文件,建目录,copy文件等等,实际上都是在

      服务器端/tmp/nfs_test里面进行的。

      也可以将两台机器上的文件相互copy...做备份也方便。

      unmount /mnt即可。

猜你喜欢

转载自my.oschina.net/u/3667353/blog/1627794