Невозможно записать несколько файлов на FTP-сервер - PullRequest
0 голосов
/ 24 октября 2018

Здравствуйте, у меня есть ошибка, такая как java.lang.NullPointerException в OutputStream out = ftp.storeFileStream (path) ;.после того, как я записал один файл и не смог продолжить запись вторых файлов на FTP-сервер.

Не могли бы вы мне помочь?код написал 1-е изображение и вообще перестал его писать.Вот мой код метода ........

    public void getIncidentPhotoByID(int incidentid, int photoId) {
    String base64Image = null;
    WebSSLClient client = new WebSSLClient();
    String photo_Id= "incident_"+incidentid;
    String jsonResponse,jsonResImg; 
    Response response =client.createRequest(PropertiesUtil.getOracleCloudRestUrL() + "/mobile/platform/storage/collections/dev_cre_incident_photos_collection/objects").get();
    jsonResponse = response.readEntity(String.class); 
    Map<String,String> imgMap = new HashMap<>();     
    try {
        JSONObject jsonObj = new JSONObject(jsonResponse);
        JSONArray jsonArr = jsonObj.getJSONArray("items");
        for (int i = 0; i < jsonArr.length(); ++i) {
            JSONObject rec = jsonArr.getJSONObject(i);
            String name = rec.getString("name");             
            String name_id = removeStr(name);
            if(name_id.equals(photo_Id)){ 
                Response response1 =client.createRequest(PropertiesUtil.getOracleCloudRestUrL() + "/mobile/platform/storage/collections/dev_cre_incident_photos_collection/objects/"+name).get();
                jsonResImg = response1.readEntity(String.class); 
                imgMap.put(name, jsonResImg);
            }           
        }            
    } catch (JSONException e) {
        e.getMessage();
    }

Я выложу 2 отдельных кода.Это один метод на самом деле.

    FTPClient ftp = new FTPClient();  
    FileInputStream fis = null;
     try  {                 
          ftp.connect("link.myjpl.com");
          ftp.login("user", "password");
          ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            Set set;
            set = imgMap.entrySet();
            Iterator iterator = set.iterator();
            while(iterator.hasNext()) {
                Map.Entry mentry = (Map.Entry)iterator.next();

                base64Image = mentry.getValue().toString();
                      System.out.println(base64Image);
                String filename =  mentry.getKey().toString();
                     System.out.println(filename);
                String[] strings = base64Image.split(",");
                String extension;
                   switch (strings[0]) {//check image's extension
                       case "data:image/jpeg;base64":
                           extension = "jpeg";
                           break;
                       case "data:image/png;base64":
                           extension = "png";
                           break;
                       default://should write cases for more images types
                           extension = "jpg";
                           break;
                   }   
                       byte[] data1 = Base64.decodeBase64(strings[1]);
                       String dirPath ="ReportImages/test/";
                       String dir = dirPath+photo_Id;
                       boolean dirExists = ftp.changeWorkingDirectory(dir);
                       if(!dirExists){
                           ftp.makeDirectory(dir);  
                       }
                       String path = dir+"/"+filename+"."+ extension;                        

                       OutputStream out = ftp.storeFileStream(path);
                       out.write(data1); 
                       ftp.completePendingCommand();
                       out.flush();
             }
                    ftp.disconnect();                             
        } catch (IOException e) {
            System.out.print(e);
            e.printStackTrace();
            System.out.println("Error while FTP'ing ");   
        } 
} 

Вот ошибка NPE!

SEVERE: 

java.lang.NullPointerException на com.scm.cre.cloud.model.services.CareCloudDbAppModuleImpl.getIncidentPhotoByID (CareCloudDbAppModuleImpl.java:144) в com.scb.js.callRestAip (ConnectTest.java:20) на com.scm.cre.batch.CareExecutor.main (CareExecutor.java:84)

Процесс завершен с кодом выхода 1. Вот снимок экрана .... введите описание изображения здесь

1 Ответ

0 голосов
/ 25 октября 2018

Взглянув на javadocs

, он говорит:

Если не удается открыть соединение для передачи данных (например, файл не существует),возвращается ноль (в этом случае вы можете проверить код ответа, чтобы определить точную причину сбоя).

Поэтому ваш код должен выполнить:

if (out == null) {
    System.out.println(ftp.getReplyCode());
    System.out.println (ftp.getReplyString());
}

В моем случаепричина в

550 В доступе отказано.

, который в моем случае можно было исправить, отредактировав /etc/vsftpd.conf

и изменив на

write_enable = YES

Сохраните файл и перезапустите vsftpd с помощью sudo service vsftpd restart.

здесь - более полный пример

FTPClient ftp = new FTPClient();

try {
    ftp.connect("somehost");
    ftp.login("user", "pw");
    ftp.enterLocalPassiveMode();

    OutputStream out = ftp.storeFileStream("dump1");
    if (out == null) {
        System.out.println(ftp.getReplyCode());
        System.out.println (ftp.getReplyString());
        return;
    }
    out.write("test is a test".getBytes());
    out.flush();
    out.close();
    System.out.println (ftp.getReplyString());
    ftp.completePendingCommand();
    System.out.println (ftp.getReplyString());

    out = ftp.storeFileStream("dump2");
    if (out == null) {
        System.out.println(ftp.getReplyCode());
        System.out.println (ftp.getReplyString());
        return;
    }
    out.write("test is a test2".getBytes());
    out.flush();
    out.close();
    System.out.println (ftp.getReplyString());
    ftp.completePendingCommand();
    System.out.println (ftp.getReplyString());

} catch (IOException e) {
    e.printStackTrace();
}
    finally {
        try {
            ftp.disconnect();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
...