您的位置:首页 > 编程语言 > PHP开发

ssm框架中,上传的资料存放在另外一台ftp服务器中是如何实现的?以及编码问题

2017-03-11 18:37 791 查看
首先贴上action层的代码

@RequestMapping(value="/add1.htm",method=RequestMethod.POST)
public String add1(@RequestParam("files") MultipartFile[] files,HttpServletRequest request,HttpServletResponse response,ServiceInfo serviceInfo) throws Exception{
serviceInfo.setService_id(getFixLenthString(10));
for (MultipartFile file : files) {

// boolean a=saveFile(file,request,serviceInfo);
if (!file.isEmpty()) {
           // getRealPath() 取得 WEB-INF 所在文件夹路径
// 如果参数是 "/temp", 当 temp 存在时返回 temp 的本地路径, 不存在时返回 null/temp (无效路径)
//String path = servletContext.getRealPath(""); /*+ File.separator + file.getOriginalFilename();*/
String path="pub";
String path2 = File.separator;//斜杠/
String fileName=file.getOriginalFilename();//文件名  比如a.jpg
String companyName=serviceInfo.getCompany_name();//公司名
path=companyName;
uploadFile(file,path,serviceInfo);
           
       }

}
addService.add(serviceInfo);
List<ServiceInfo> list=addService.sel();
request.setAttribute("list", list);
return "success";
}

上传方法

    /**

     * 上传文件的方法  文件类型为MultipartFile

     * @param files

     * @param path 公司名

     */

    public static void uploadFile(MultipartFile files,String path,ServiceInfo serviceInfo) {

    FTPClient ftpClient = new FTPClient();

    try {

        ftpClient.connect("192.168.33.110", 21);

        ftpClient.login("zzy", "zzy");

        ftpClient.enterLocalPassiveMode();

        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

        String originalFilename = files.getOriginalFilename();//文件名字  eg:cas.war

        String separator = File.separator;//斜杠"\"

        //文件最终存储的位置  在pub下以公司名为名字的文件夹下的文件

        String pathFile="pub"+separator+path+separator+originalFilename;

        path=separator+path;//保存的文件夹路径  /独创时代

        // 设置上传目录

        String basePath="pub";//进入pub目录

        String companyPath=basePath+separator+serviceInfo.getCompany_name();

        ftpClient.changeWorkingDirectory(basePath);//进入pub目录

        //在pub目录下创建以公司名为名字的文件夹

        String companyName=serviceInfo.getCompany_name();

        boolean isExit = ftpClient.makeDirectory(new String(serviceInfo.getCompany_name().getBytes("utf-8"),"iso8859-1"));

        if(isExit){

        System.out.println("文件夹创建成功");

        }else {
System.out.println("文件夹已存在");
}

        //文件后缀名,比如得到cas.war  取得war

        String contentType = files.getOriginalFilename().substring(files.getOriginalFilename().lastIndexOf('.')+1);
if("war".equals(contentType)){
serviceInfo.setWar_name(files.getOriginalFilename());
serviceInfo.setWar_url(pathFile);
}
if("sql".equals(contentType)){
serviceInfo.setDb_url(pathFile);
}
if("jpg".equals(contentType)){
serviceInfo.setPic_url(pathFile);
}

        ftpClient.changeWorkingDirectory(new String(serviceInfo.getCompany_name().getBytes("utf-8"),"iso8859-1"));

//        String fileName = new String(files.getOriginalFilename().getBytes(

//                "ISO-8859-1"), "UTF-8");

        String fileName=new String(files.getOriginalFilename().getBytes("utf-8"),"iso8859-1");

        FTPFile[] fs = ftpClient.listFiles();

        if (fs != null && fs.length > 0) {

            for (int i = 0; i < fs.length; i++) {

                if (fs[i].getName().equals(fileName)) {

                    ftpClient.deleteFile(fs[i].getName());

                    break;

                }

            }

        }

        ftpClient.changeWorkingDirectory(companyPath);

        OutputStream os = ftpClient.appendFileStream(fileName);

        byte[] bytes = new byte[10240];

        InputStream is = files.getInputStream();

       

        int c;

        // 暂未考虑中途终止的情况

          while ((c = is.read(bytes)) != -1) {

            os.write(bytes, 0, c);

        }

        os.flush();

        is.close();

        os.close();

    } catch (IOException e) {

        e.printStackTrace();

    } finally {

        try {

            ftpClient.disconnect();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    }

jsp页面的代码

<body > 
<form action="<%=request.getContextPath()%>/add1.htm" method="post" enctype="multipart/form-data"> 
公司名字:<input type="text" name="company_name" id="company_name"><br/>
服务名称:<input type="text" name="service_name" id="service_name"><br/>
服务类型:<input type="text" name="type" id="type"><br/>
描述:<input type="text" name="description" id="description"><br/>
war包:<input type="file" name="files" id="companyName"><br/>
sql文件:<input type="file" name="files" id="sqlFile1"><br/>
图标:<input type="file" name="files" id="icon"><br/>
<input type="submit" value="添加">
</form>

</body>

公司的项目,上传到ftp的时候遇到比较多的问题,首先就是上传的速度比较慢,仔细研究了一下,有以下几点原因

1、在ping的时候,网络延迟比较高

2、开辟的缓存空间比较小

解决以上两个问题就ok了  

网络的问题我用了路由器直连来解决的,缓存空间的问题我增加了10倍,原来是1024  给加到了10240  这样速度会快很多

乱码问题:

解决乱码问题首先要从本地的编码格式来找,我找之后发现本地的编码格式是UTF-8,没有问题,可是上传文件的时候还有创建文件夹的时候总是会出现问题,后来我把上传的格式改成了iso8859-1这样就没有问题了,应该是ftp服务器那边的编码格式的问题,可以设置,不过我懒得设置了,项目还没上线,到时候看甲方提供的服务器是怎么回事,然后再修改。

文件夹路径问题:

ftpClient.changeWorkingDirectory(new String(serviceInfo.getCompany_name().getBytes("utf-8"),"iso8859-1"));

用这个方法来进入某个文件夹,这个方法就像是cd ***

所以我们在一个目录,比如在root目录下,想要进入etc目录的时候,只要在里面写上etc就好了,不需要写 成/root/etc 这样会出现问题。

乱码ps:

有可能上传的文件名会为乱码,有的时候根本就上传不上去,当然,也不会跟你提示,因为原本就没异常。在网上找了好多解答方案,众说纷纭,几乎都是从一个版本拷贝过去的,也没有经过自己的真是检验。为此,也吃了不少苦头。大致分为以下两种解决方案:
1、加上以下三句即可解决

ftpClient.setControlEncoding(“GBK”);

FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);

conf.setServerLanguageCode("zh");
解答:经过测试,根本上行不通,上述问题依然存在

2、与上述方式有所类似,但我觉得这种方式更靠谱一点

首先,加上ftpClient.setControlEncoding(“GBK”);这一句,然后,将所有的中文进行转码为“ISO-8859-1”格式,如下:

ftpClient.changeWorkingDirectory(new String(remotePath.getBytes("GBK"),"iso-8859-1"));

解答:经过测试,仍然行不通,之所以我说此方式更靠谱一点,请继续往下看

首先我们来说说为什么要进行转码:

因为在FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码。

接下来的问题是,我们应该将什么编码转换为此格式。因此,就有了第二种解决方案——把 GBK格式的转换为ISO-8859-1格式。而且,有的人还说,必须得这么转。其实,之所以他们能这么说,我觉得完全是巧合。它的真正原理是,既然 FTP协议规定的编码格式是“ISO-8859-1”,那么我们确实得将格式转换一下,然后等服务器收到文件时再自动转换为系统自带的编码格式,因此,关键不是规定为什么格式,而是取决于FTP服务器的编码格式。因此,如果FTP系统的编码格式为“GBK”时,第二种方式肯定会成功;但是,如果系统的编码格式为“UTF-8”时,那就会仍然出现乱码啦。所以,我们只能通过代码先获取系统的编码格式,然后通过此编码格式转换为ISO-8859-1的编码格式。获取方式如下:

private static String encoding = System.getProperty("file.encoding");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux ftp java 乱码