无法在FTP服务器上写入多个文件 [英] Unable to write multiple file on FTP server
问题描述
您好我在OutputStream out = ftp.storeFileStream(path);上遇到java.lang.NullPointerException等错误。在我写一个文件后,无法继续在FTP服务器上写第二个文件。
Hello I have got error such as java.lang.NullPointerException on OutputStream out = ftp.storeFileStream(path);. after I write one file and was not able to continue to write second files on FTP server.
你能帮帮我吗?代码写了第一张图片并完全停止写了。
这是我的方法代码........
Could you please help me? the code wrote 1st image and stopped writing it at all. Here is my method code ........
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个单独的代码。事实上,这是一种方法。
I will post 2 separate codes. It's one method in fact.
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
at com.scm.cre.cloud.model.services.CareCloudDbAppModuleImpl.getIncidentPhotoByID(CareCloudDbAppModuleImpl.java:144)
at com.scm.cre.batch。 job.ConnectTest.callRestAip(ConnectTest.java:20)
at com.scm.cre.batch.CareExecutor.main(CareExecutor.java:84)
java.lang.NullPointerException at com.scm.cre.cloud.model.services.CareCloudDbAppModuleImpl.getIncidentPhotoByID(CareCloudDbAppModuleImpl.java:144) at com.scm.cre.batch.job.ConnectTest.callRestAip(ConnectTest.java:20) at com.scm.cre.batch.CareExecutor.main(CareExecutor.java:84)
进程退出退出代码1.
这是一个截屏....
在此处输入图像说明
Process exited with exit code 1. Here is a screen shot.... enter image description here
推荐答案
查看 javadocs
它说:
如果无法打开数据连接(例如,文件不存在) ,返回null(在这种情况下,您可以检查答复用于确定失败的确切原因的代码。)
因此您的代码应该执行:
Therefore your code should do:
if (out == null) {
System.out.println(ftp.getReplyCode());
System.out.println (ftp.getReplyString());
}
在我的情况下,原因是
550权限被拒绝。
在我的案例中可以通过编辑/etc/vsftpd.conf来解决这个问题
which in my case was curable by editing /etc/vsftpd.conf
并更改为
write_enable = YES
保存文件并使用sudo service vsftpd restart重新启动vsftpd。
Save the file and restart vsftpd with 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();
}
}
这篇关于无法在FTP服务器上写入多个文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!