사진을 업로드하고 미리 볼 수있는 페이지를 만들고 있습니다. 업로드와 미리보기가 잘 동작합니다. 하지만 문제는 이미지를 업로드 한 다음 미리보고 나서 이미지 업로드 페이지로 돌아 가면 이미지가 사라진다는 것입니다. 그때 사라 이미지를 미리보기 한 후 다시이 페이지에 올 때 여기 내 코드페이지 리디렉션 사이의 상태를 유지하는 방법 JSf 2.0
<h:panelGrid columns="4"
border=""
width="20%"
style="position: absolute; top: 50px;"
columnClasses="asteriskColumns, nameColumns" >
<h:outputText value="*" />
<h:outputText value="Map: " />
<p:fileUpload id="cityMap"
description="Image"
update="mapImage messages"
allowTypes="*.jpg;*.png;*.gif;*.jpeg;"
auto="true"
fileUploadListener="#{cityDetail.imageUpload}" >
</p:fileUpload>
<p:graphicImage id="mapImage"
value="#{cityDetail.imagePath}"
width="80"
height="50"
cache="false" />
<h:outputText value="*" />
<h:outputText value="Image1: " />
<p:fileUpload id="cityImage1"
description="Image"
update="city_Image1 messages"
allowTypes="*.jpg;*.png;*.gif;*.jpeg;"
auto="true"
fileUploadListener="#{cityDetail.imageUpload}" >
</p:fileUpload>
<p:graphicImage id="city_Image1"
value="#{cityDetail.imagePath}"
width="80"
height="50"
cache="false" />
<h:outputText value="*" />
<h:outputText value="Image2: " />
<p:fileUpload id="cityImage2"
description="Image"
update="city_Image2 messages"
allowTypes="*.jpg;*.png;*.gif;*.jpeg;"
auto="true"
fileUploadListener="#{cityDetail.imageUpload}" >
</p:fileUpload>
<p:graphicImage id="city_Image2"
value="#{cityDetail.imagePath}"
width="80"
height="50"
cache="false" />
것은 여기 지금 내 콩
@ManagedBean
@ViewScoped
@SessionScoped
public class CityDetail {
private StreamedContent image;
private ArrayList images;
private ArrayList imageNames;
private String imagePath = "/resources/images/Untitled.jpg";
private String imagePath1 = "/resources/images" + "/";
public CityDetail() {
images = new ArrayList();
images.add(null);
images.add(null);
images.add(null);
images.add(null);
images.add(null);
imageNames = new ArrayList();
imageNames.add("");
imageNames.add("");
imageNames.add("");
imageNames.add("");
imageNames.add("");
// Getting session ID from seession variable that is set in the City_Review Page
cityID = Integer.parseInt(ConnectionUtil.session.getAttribute("CityID").toString());
System.out.println();
}
public void imageUpload(FileUploadEvent event) {
imagePath = "";
// Variable to ensure that the query is always enter to same index.
int index = -1;
String query = "";
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
// File
UploadedFile uploadedFile = event.getFile();
// File Name
String fileName = uploadedFile.getFileName();
//File Extension
String fileExtension = fileName.substring(fileName.lastIndexOf('.'), fileName.length());
String path = externalContext.getRealPath("/resources/images") + "/" ;
try {
//<p:fileUpload id="cityMap" .../>
String componentID = event.getComponent().getClientId();
if (componentID.equalsIgnoreCase("cityMap")) {
index = 0;
/**
* UPDATE table_name SET column1=value, column2=value2,... WHERE some_column=some_value
*/
query = "UPDATE city set citymap=(?) where cityid=" + cityID;
boolean reslut = ConnectionUtil.deleteImageIfExist(path, "cityMap_" + cityID);
boolean outcome = ConnectionUtil.createFile("cityMap_" + cityID, fileExtension ,path, uploadedFile);
if (outcome) {
addImageNameToList(index, "cityMap_" + cityID + fileExtension);
setImage(imagePath1, "cityMap_" + cityID + fileExtension);
//imagePath = imagePath + "cityMap" + fileExtension;
}
} else if (componentID.equalsIgnoreCase("cityImage1")) {
index = 1;
query = "UPDATE city set cityimage1=(?) where cityid=" + cityID;
boolean reslut = ConnectionUtil.deleteImageIfExist(path, "cityImage1_" + cityID);
boolean outcome = ConnectionUtil.createFile("cityImage1_" + cityID, fileExtension ,path, uploadedFile);
if (outcome) {
addImageNameToList(index, "cityImage1_" + cityID + fileExtension);
setImage(imagePath1, "cityImage1_" + cityID + fileExtension);
}
} else if (componentID.equalsIgnoreCase("cityImage2")) {
index = 2;
query = "UPDATE city set cityimage2=(?) where cityid=" + cityID;
boolean reslut = ConnectionUtil.deleteImageIfExist(path, "cityImage2_" + cityID);
boolean outcome = ConnectionUtil.createFile("cityImage2_", fileExtension ,path, uploadedFile);
if (outcome) {
addImageNameToList(index, "cityImage2_" + cityID + fileExtension);
setImage(imagePath1, "cityImage2_" + cityID + fileExtension);
}
} else if (componentID.equalsIgnoreCase("cityImage3")) {
index = 3;
query = "UPDATE city set cityimage3=(?) where cityid=" + cityID;
boolean reslut = ConnectionUtil.deleteImageIfExist(path, "cityImage3_" + cityID);
boolean outcome = ConnectionUtil.createFile("cityImage3_" + cityID, fileExtension ,path, uploadedFile);
if (outcome) {
addImageNameToList(index, "cityImage3_" + cityID + fileExtension);
setImage(imagePath1, "cityImage3_" + cityID + fileExtension);
}
} catch (Exception e) {
FacesMessage msg = new FacesMessage("Exception happen");
FacesContext.getCurrentInstance().addMessage(null, msg);
e.printStackTrace();
// return null;
}
} //end of imageUpload()
private void setImage(String path, String fileName) {
imagePath = path + fileName;
}
입니다. 이 문제를 어떻게 방지 할 수 있습니까? 5 개의 이미지 경로 변수를 만든 다음 다른 곳에 저장합니까? 하지만 50 이미지가 있다면? 더 좋은 옵션이 있습니까? 내가 다시이 페이지를 업로드 할 때 다시 올 때 모든 것이 그대로이 페이지에 그대로 남아 있습니까?
안녕하세요. 네, 모든 이미지에 대해 동일한 경로를 사용했고 시스템 이벤트를 사용하여이 작업을 수행했습니다. 내 의견에 어떻게 코드를 넣을 수 있을지 모르겠다. 또한 한계는 매우 제한적입니다. 모든 것이 잘 작동합니다. 실제로 내가 파일을 업로드 버튼을 누르면 내 생성자가 호출되지 않기 때문에보기 범위를 사용했습니다. 내 페이지에 5 개의 파일 업로드 버튼이 있고 파일 업로드 버튼을 클릭 할 때마다 생성자 호출을 알게되었습니다. 내가 이미지 이름을 목록에 저장하고 세션 변수에 목록을 저장하기 때문에 세션 범위를 사용했습니다. – Basit
만약 내가보기 범위 만 사용한다면 어떻게 이미지 이름을 세션에 저장할 수 있습니까? 그리고 만약 내가보기 범위를 사용했다면 생성자는 여러 번 호출합니다. 그래서 내가 두 범위를 모두 사용했습니다. 이것이 나쁜 습관이라면 최선의 방법을 알고 싶기 때문에 알려주십시오. 오, 죄송합니다. 실제로 이미지 경로를 반환하기 때문에 실제로 getter 속성을 표시하지 않았습니다. 여기에 내 재산 :) 공용 문자열 getImagePath() { 반환 imagePath; } 고마워요 :) – Basit
관리 빈은 두 개의 범위를 가질 수 없으며, sessionscope는 viewscope보다 오래 지속됩니다.탐색하는 동안 페이지의 상태를 유지하려면 세션 범위에 넣거나 FlashScope (http://www.jroller.com/HazemBlog/entry/understanding_the_jsf_2_0)와 함께 viewscope를 사용해야합니다. 플래시 스코프는 다르게 작동하므로 다른 스코프와 함께 사용할 수 있습니다. –