I have a java application in a docker container and saving pictures is working fine but getting them doesnt work I get Error: javax.imageio.IIOException: Can't read input file!.
this is my doker image,
FROM openjdk:17-jdk-alpine
ARG JAR_FILE=*.jar
EXPOSE 9000
COPY build/libs/wall-0.0.1-SNAPSHOT.jar .
ENTRYPOINT ["java","-jar","wall-0.0.1-SNAPSHOT.jar"]
The mounting part is being done in the kubernetes cluster configuration:
apiVersion: apps/v1
kind: Deployment
metadata:
name: wall-app
labels:
app: wall-app
spec:
replicas: 1
selector:
matchLabels:
app: wall-app
template:
metadata:
labels:
app: wall-app
spec:
containers:
- name: wall-app
image: u/wall
imagePullPolicy: Always
ports:
- containerPort: 9010
resources:
limits:
memory: 512Mi
volumeMounts:
- name: images-volume
mountPath: /images
volumes:
- name: images-volume
hostPath:
path: /home/ubuntu/images-volume
My java application function to get image: Not: Im sure that the pic name is corret the probelm is with the input stream
@PostMapping(value = "/post/image")
public @ResponseBody String getImageAsBase64(@RequestBody String json){
try {
JSONObject jsonObject = new JSONObject(json);
String path = "/images/post/" jsonObject.get("postId) "/" jsonObject.get("pictureName");
InputStream in = getClass()
.getResourceAsStream(path);
String encodedString = Base64.getEncoder().encodeToString(IOUtils.toByteArray(in));
System.out.print(path);
//images/post/5/test.png
return encodedString;
}catch(Exception e) {
System.out.println("picture not found" e);
}
return null;
}
I tried ../ to get one directory above but it did not work
CodePudding user response:
That getResourceAsStream
method is only to be used for reading resources (files) from the classpath, which is a rather logical thing. As far as I can see, you want to read the images directly from the file system, outside of your classpath as can be observed from your ENTRYPOINT
. For that, you can use FileInputStream
. So, you have to replace the in
variable with the following code:
InputStream in = new FileInputStream(path);
But don't forget about closing the input stream. You can use the convenient try-with-resources statement for that purpose. After that, your relevant piece of code will look like this:
try (InputStream in = new FileInputStream(path)) {
String encodedString = Base64.getEncoder().encodeToString(IOUtils.toByteArray(in));
System.out.print(path);
//images/post/5/test.png
return encodedString;
}