java - تحميل الملف بنجاح، ولكن يتم تحميل ملف 0kb على الملقم البعيد باستخدام جش سفتب جافا




file upload (2)

أنا أتفق مع إجابة كنستر. كان لي مشكلة مماثلة على آلة النوافذ عن بعد والمسار مع نمط لينكس حل مشكلتي. أردت فقط إضافة، الدليل الجذر ل تشانلزفتب هو C: \ القرص على جهاز ويندوز البعيد وأنا لست متأكدا من أن هناك طريقة لوضع الملف على D: \ القرص.

أنا تحميل ملف من جهاز الكمبيوتر المحلي إلى الملقم البعيد في تطبيق جافا بسيط باستخدام جش، وبروتوكول سفتب.

التعليمات البرمجية لا تحصل على أي خطأ أو أي استثناء وتشغيله بنجاح، ولكن عندما أنظر إلى الموقع البعيد، يتم تحميل الملف كما 0kb مع عدم وجود تمديد واسمه 'D'.

لقد حاولت العديد من الطرق ولكن أنا لست قادرا على معرفة الخطأ.

هنا هو شفرتي ..

        String remoteDirectory = "D:\\Datastores\\RootStore\\Test\\";
        String localDirectory = "C:\\pdffiles\\";


        String fileToFTP = "demo.pdf";
        String SFTPHOST = "hostIPaddress";
        int SFTPPORT = 22;
        String SFTPUSER = "username";
        String SFTPPASS = "password";


        String local_filename = fileToFTP;
        String local_pathname = localDirectory;
        String remote_filename = fileToFTP;


        JSch jsch = null;
        Session session = null;
        ChannelSftp sftpChannel = null;


        try
        {
          jsch = new JSch();
          session = jsch.getSession(SFTPUSER, SFTPHOST);
          session.setPassword(SFTPPASS);
          session.setPort(SFTPPORT);
          session.setConfig("StrictHostKeyChecking", "no");
          session.setConfig("cipher.s2c", "aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,aes256-ctr");
          session.setConfig("cipher.c2s", "aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,aes256-ctr");
          session.connect();

          sftpChannel = (ChannelSftp)session.openChannel("sftp");
          sftpChannel.connect();

          System.out.println(sftpChannel);
          System.out.println(sftpChannel.getSession().isConnected());

          FileInputStream fileBodyIns = new FileInputStream(local_pathname + local_filename);

          System.out.println(local_pathname + local_filename);
          System.out.println(remoteDirectory + remote_filename);

          sftpChannel.put(fileBodyIns, remoteDirectory + remote_filename);
          fileBodyIns.close();

          sftpChannel.exit();
          session.disconnect();

          System.out.println("File uploaded successfully");
          return "File uploaded successfully";
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return e.getMessage();
        }

اتصالي يجعل بنجاح، والخط

System.out.println(sftpChannel.getSession().isConnected());

يعطي صحيح

وطباعة الخطوط التالية بنجاح

System.out.println("File uploaded successfully");

String remoteDirectory = "D:\\Datastores\\RootStore\\Test\\";

يستخدم بروتوكول سفتب نظام تسمية تشبه أونيكس لملفات أسماء الملفات على الملقم البعيد. فاصل الملف هو "/"، ويعتبر اسم المسار بدون الرائدة "/" بالنسبة إلى الدليل الحالي. الكولون والظهر المائل ليس له معنى خاص.

بواسطة هذه القواعد، كنت تطلب من الملقم البعيد لإنشاء ملف في الدليل الرئيسي الخاص بك المسمى "D: \ داتاستوريس ..." مع القولون الحرفي والظهر المائل. إذا كان الملقم البعيد الخاص بك هو ملقم سيغوين أوبنسه أو بعض منفذ آخر من خادم يستند إلى أونيكس، قد يكون هناك عدم تطابق بين الطريقة يفسر خادم سفتب اسم الملف والطريقة التي يفسر نظام التشغيل ويندوز اسم الملف.

تحتاج إلى معرفة بناء الجملة الصحيح للإشارة إلى مسارات على محرك الأقراص D: من خلال هذا الملقم سفتب. إذا كان خادم سيغوين سفتب، أعتقد أن بناء الجملة الصحيح سيكون "/ سيغدريف / د / داتاستوريس / روتستور / اختبار / ...". إذا كان ملقم سفتب من قبل بعض الموردين الآخرين، قد تحتاج إلى استشارة وثائق الملقم. بدلا من ذلك، يمكنك محاولة تسجيل الدخول إلى ملقم سفتب بشكل تفاعلي، cd'ing إلى الدليل "/"، واستكشاف من هناك. يجب أن تصبح واضحة كيفية الرجوع إلى المجلدات على محرك الأقراص D.







jsch