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");
@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");
相关文章推荐
- SSM框架中-使用KindEditor+Nginx服务器+FTP服务,实现多文件上传
- Android MediaRecorder H264 编码实时视频流不能播放(readInt()值太大)以及如何将流实时上传到服务器的方法
- 如何开发一个java开源框架-----Jvn框架之实现文件的上传以及方法封装(第六讲)八哥实力讲解
- java POI导出excel(带有图片的数据)以及ftp上传图片到另一台服务器的方法参考代码
- 如何把文件上传到另外一台服务器
- asp.net如何把文件上传到另外一台服务器
- 如何把文件上传到另外一台服务器【转】
- asp.net如何把文件上传到另外一台服务器
- 如何把文件上传到另外一台服务器
- 如何把文件上传到另外一台服务器
- asp.net如何把文件上传到另外一台服务器[CSDN]。
- 如何把文件上传到另外一台服务器2
- ASP.Net如何把文件从一台服务器上传到另外一台服务器
- 如何把文件上传到另外一台服务器
- 如何把文件上传到另外一台服务器
- 如何把文件上传到另外一台服务器1
- 如何把文件上传到另外一台服务器【转】
- 使用jersey实现图片上传到另外一台服务器
- 如何把文件上传到另外一台服务器3
- 嵌入式 在arm平台运行ftpd服务器实现文件下载以及上传以及ftp下载url小结