java如何上传本地文件夹到其他服务器(不一定是FTP服务器)

java如何上传本地文件夹到其他服务器(不一定是FTP服务器),第1张

文件夹传输要用递归循环文件夹里面的内容,遇到一个文件夹就新建一个文件夹,否则新建文件,然后一个一个的用字节流传输(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

~你敢告诉我,我的回答哪不符合规定了么??不告诉我原因我怎么改???

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » java如何上传本地文件夹到其他服务器(不一定是FTP服务器)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情