This is another post about file handling in ADF. Previous post was about uploading and downloading any type of file from absolute server path
See-
Uploading and downloading files from absolute server path in Oracle ADF (12.1.3)
This post is specifically about handling image files, uploading an image file to server path and immediately show it on page using af:image component
So here i am using Jdev 12C (12.1.3) , see step by step implementation
- Create a fusion web application and a page in viewController
- Now drop af:inputFile (to browse and select file), af:image (to show uploaded image) and a button to upload file
- Bind af:inputFile value to managed bean variable, this variable is further used to read or write or process file
//To Store Value of selected file
private UploadedFile imageFile;
public void setImageFile(UploadedFile imageFile) {
this.imageFile = imageFile;
}
public UploadedFile getImageFile() {
return imageFile;
}
- Now see Managed Bean method to upload image file to absolute server path
Bean Method to Upload File-
//To Store path of uploaded Image file
String imagePath = null;
public void setImagePath(String imagePath) {
this.imagePath = imagePath;
}
public String getImagePath() {
return imagePath;
}
/**Method to upload image file to absolute server path*/
private String uploadImage(UploadedFile file) {
UploadedFile myfile = file;
if (myfile == null) {
} else {
if (myfile.getContentType().equalsIgnoreCase("image/jpeg") ||
myfile.getContentType().equalsIgnoreCase("image/png") ||
myfile.getContentType().equalsIgnoreCase("image/bmp") ||
myfile.getContentType().equalsIgnoreCase("image/gif")) {
//Path of folder on drive
String path = "D://ADF//";
String type = "PNG";
String TypeVal = ".png";
if (myfile.getContentType().equalsIgnoreCase("image/jpeg")) {
type = "JPEG";
TypeVal = ".jpeg";
} else if (myfile.getContentType().equalsIgnoreCase("image/png")) {
type = "PNG";
TypeVal = ".png";
} else if (myfile.getContentType().equalsIgnoreCase("image/bmp")) {
type = "PNG";
TypeVal = ".png";
} else if (myfile.getContentType().equalsIgnoreCase("image/gif")) {
type = "GIF";
TypeVal = ".gif";
}
InputStream inputStream = null;
try {
//Generate a unique name for uploaded image with date time
DateFormat dateFormat = new SimpleDateFormat("yyMMdd_HHmmss");
Date date = new Date();
String dtTime = dateFormat.format(date);
dtTime = dtTime.replace(" ", "_");
String name = "IMG" + "_" + dtTime;
System.out.println("File name is-" + name);
inputStream = myfile.getInputStream();
BufferedImage input = ImageIO.read(inputStream);
//Writing file to path
File outputFile = new File(path + name + TypeVal);
ImageIO.write(input, type, outputFile);
imagePath = outputFile.getAbsolutePath();
} catch (Exception ex) {
// handle exception
ex.printStackTrace();
} finally {
try {
inputStream.close();
} catch (IOException e) {
}
}
} else {
imagePath = "NO";
}
}
setImageFile(null);
return imagePath;
}
ActionListener of Upload Button-
/**Action Listener to Upload image File
* @param actionEvent
*/
public void uploadImageFileAction(ActionEvent actionEvent) {
File directory = new File("D://ADF//");
//get all the files from a directory
File[] fList = directory.listFiles();
for (File file : fList) {
//Delete all previously uploaded files
if (!"NoImage.png".equalsIgnoreCase(file.getName())) {
file.delete();
}
}
//Upload Currently Selected File
String flag = uploadImage(imageFile);
if ("NO".equalsIgnoreCase(flag)) {
FacesMessage msg =
new FacesMessage("This is not an Image file, Please upload supported file type (.jpg,.png etc)");
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
- set usesUpload to true for af:form component on page to support file upload
- Now upload part is complete , next is to show uploaded image on page. So to do this create a servlet (this will process image file into bytes and then show using af:image component)
- See Servlet code and how it is mapped with af:image component
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ViewImageServlet extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=UTF-8";
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
/**
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String path = (request.getParameter("path"));
OutputStream os = response.getOutputStream();
//If path is null or file is not an image
if (path.equalsIgnoreCase("No")) {
path = "D:\\ADF\\NoImage.png";
}
if (request.getParameter("path") == "") {
path = "D:\\ADF\\NoImage.png";
}
InputStream inputStream = null;
try {
File outputFile = new File(path);
inputStream = new FileInputStream(outputFile);
BufferedInputStream in = new BufferedInputStream(inputStream);
int b;
byte[] buffer = new byte[10240];
while ((b = in.read(buffer, 0, 10240)) != -1) {
os.write(buffer, 0, b);
}
} catch (Exception e) {
System.out.println(e);
} finally {
if (os != null) {
os.close();
}
if (inputStream != null) {
inputStream.close();
}
}
}
}
- Now run this application and check this (All uploaded files will be stored in D://ADF path)
Select an image and click upload (Image is immediately reflected on page)
Check in D://ADF folder, image file is uploaded there with a new name
Again upload another image-
Check that previous file is deleted from folder and current one is there-
Happy Learning :)