java如何上传本地文件夹到其他服务器(不一定是FTP服务器)
文件夹传输要用递归循环文件夹里面的内容,遇到一个文件夹就新建一个文件夹,否则新建文件,然后一个一个的用字节流传输(FileInputStream和FileOutputStream),不过这样效率会很低,
client中的outflush()有问题。不能再循环内outflush,它会向Server将你的OutputStream发送过去,然后你的服务器取读了一句话就写入了一句话关闭了。下一个循环你再向服务器推送数据就会发现连接关闭了。不知道正不正确。
关于使用Socket的flush过去无法readLine得到的问题原因是这样的:
flush方法只是将字符刷新过去。
readLine方法读取一行数据,注意:一行数据是以\r\n作为终止条件的。
flush过去的数据一般是没有换行符的,所以就无法读取。
为什么有时候我们flush过去的却能够得到呢?有些时候,我们flush之后就没有代码了,然后代码执行完自动将流close调,所以给它加上了换行符过去,所以readLine可以读取到。
close方法也会刷新缓存流,并且会在数据结尾加上换行符。
这个很关键!
你可以尝试在flush之前使用BufferedWriter的newLine();方法,这样你会发现flush刷新过去的在服务器端是可以读取到的,不一定需要shutdownInputStream或者shutDownOutputStream。
newLine
public void newLine()
throws IOException
写入一个行分隔符。行分隔符字符串由系统属性 lineseparator 定义,并且不一定是单个新行 ('\n') 符。
抛出:
IOException - 如果发生 I/O 错误
close
public abstract void close()
throws IOException
关闭此流,但要先刷新它。在关闭该流之后,再调用 write() 或 flush() 将导致抛出 IOException。关闭以前关闭的流无效。
指定者:
接口 Closeable 中的 close
抛出:
IOException - 如果发生 I/O 错误
flush
public void flush()
throws IOException
刷新该流的缓冲。
指定者:
接口 Flushable 中的 flush
指定者:
类 Writer 中的 flush
抛出:
IOException - 如果发生 I/O 错误
readLine
public String readLine()
throws IOException
读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
返回:
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
给一种方式做参考,我这边类似。是将A作为客户端,上传文件到服务器B,服务器B以struts接受请求做处理。使用httpclient。
/将文件上传到服务端,并接收其返回信息
@param client DefaultHttpClient
@param url 服务器url:如:http://localhost:8080/test/uploadaction
@param filePath 文件路径
@param params 上传参数
@param encode 编码集,主要用来解析返回的response中的信息
@return 解析出的返回信息,如服务器那边的成功提示:“success”
/
public static String sendHttpClientPostToUpload(DefaultHttpClient client, String url, String filePath,
Map<String, String> params, String encode){
MultipartEntity mpEntity = new MultipartEntity();
if (params != null && !paramsisEmpty()) {
for (MapEntry<String, String> entry : paramsentrySet()) {
// 参数名
StringBody par;
try {
par = new StringBody(entrygetValue()toString());
mpEntityaddPart(entrygetKey(), par);
} catch (UnsupportedEncodingException e) {
eprintStackTrace();
}
}
}
//
if (!filePathequals("")) {
FileBody file = new FileBody(new File(filePath));
mpEntityaddPart("file", file);
}
// 使用HttpPost对象设置发送的URL路径
HttpPost post = new HttpPost(url);
postsetEntity(mpEntity);
// 创建一个浏览器对象,以把POST对象向服务器发送,并返回响应消息
try {
HttpResponse response = clientexecute(post);
if (responsegetStatusLine()getStatusCode() == HttpStatusSC_OK) {
// 封装了服务器端返回的数据
HttpEntity responseEntity = responsegetEntity();
//这里是对服务器返回的session进行记录的操作,以获取sessionId
// CookieStore mCookieStore = ((DefaultHttpClient) client)getCookieStore();
// List<Cookie> cookies = mCookieStoregetCookies();
// for (int i = 0; i < cookiessize(); i++) {
// // 如果cookies头和"JSESSIONID" 就记录sessionID
// if ("JSESSIONID"equals(cookiesget(i)getName())) {
// String sessionId = cookiesget(i)getValue();
// break;
// }
// }
//完成
InputStream is = responseEntitygetContent();
return changeInputStream(responseEntitygetContent(), encode);
}
} catch (ClientProtocolException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
}
return "";
}/
@param inputStream
@param encode
@return
/
private static String changeInputStream(InputStream inputStream,
String encode) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len = 0;
byte[] date = new byte[1024];
String result = "";
try {
while ((len = inputStreamread(date)) != -1) {
outputStreamwrite(date, 0, len);
}
result = new String(outputStreamtoByteArray(), encode);
return result;
} catch (IOException e) {
eprintStackTrace();
}
return null;
}
需要的参数client,new 一个就可以了。
DefaultHttpClient client = new DefaultHttpClient();类似参考网上有很多,不过大都是你转载他得,他转载你的,能用的不多。
上传文件时,需要给SmartUpload传一个上传文件的保存地址,一般都用一个String来表示,使用request来获得。比如,你要把文件保存在项目路径下的upload文件夹,刚:
String
path
=
requestgetRealPath("upload");//获取upload文
//夹的绝对路径。
//得到:c://项目名/upload/
然后再拼上你的文件名,比如你上传一个叫testtxt的文件,则全部的URL为:
path
+
fileName
=
"c:///项目名/upload/"+"texttxt";
在实际的编程中,其实数据库只需要保存fileName就可以了,path作为配置,每次系统加载时再去读取,这样做的好处是:系统的环境变化时,只需要修改配置文件就能够搞定,而且不会重复保存多余的路径(因为路径都是一样的)
可以通过ftp的方式上传到指定服务器
希望我团的答案能给您一定的帮助~祝您早日解决问题~!
soso
~你敢告诉我,我的回答哪不符合规定了么??不告诉我原因我怎么改???
0条评论