Exploitation d'une donnée Blob dans JDev
j'ai une table dans la base qui contient une colonne de type blob c.a.d image
dans jdev j'ai utilisé le mapping entre le relationnel et l'objet c.a.d j'ai generé
une classe pour cette table ,mon probléme au moment de l'affichage d'une page JSF rattaché à ma table l'image n'apparait pas
affichage d'image à partir d'une colonne blob d'oracle
Bonjour Najib,
L'affichage d'une image à partir d'une colonne blob est un peu compliqué et le problème, bien que connu, est un peu long à expliquer. Donc je vais directement te proposer une solution (qui marche avec Jdev 11):
Supposant que tu as une table "user" avec les colonnes (nom, prenom, image)
- Sur la page JSF il affiche l'image comme étant une champ "Input text" donc clic droit sur ce champ puis "convert" et puis tu choisis "image".
- Tu crées une servlet qui aura pour rôle d'acquérir l'image depuis la BD et de la renvoyer en tant qu'un flux lisible par la page JSF.
Voici un exemple de servlet que tu dois modifier :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| package view.demo;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import oracle.jbo.ApplicationModule;
import oracle.jbo.Key;
import oracle.jbo.Row;
import oracle.jbo.ViewObject;
import oracle.jbo.client.Configuration;
import oracle.jbo.domain.BlobDomain;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Servlet1 extends HttpServlet {
private static final Log LOG = LogFactory.getLog(Servlet1.class);
private static String lastPic = "";
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id=request.getParameter("id");
if (id != null) {
lastPic = id;
}
String imgno=request.getParameter("imgno");
String appModuleName = "demo.model.AppModule";
String appModuleConfig = "AppModuleLocal";
String voQuery = "";
if (id == null) {
voQuery = "select employee_pic from pics where employee_id = '"+lastPic+"'";}
else{
voQuery = "select employee_pic from pics where employee_id = '"+id+"'";
}
String mimeType = "jpeg";
ApplicationModule am = Configuration.createRootApplicationModule(appModuleName, appModuleConfig);
ViewObject vo = am.createViewObjectFromQueryStmt("picsView", voQuery);
// Run the query
vo.executeQuery();
// Get the result (only the first row is taken into account)
Row product = vo.first();
BlobDomain image = null;
// Check if a row has been found
if (product != null) {
// We assume the Blob to be the first a field
image = (BlobDomain)product.getAttribute(0);
if (product.getAttributeCount() > 1) {
mimeType = (String)product.getAttribute(1);
}
} else {
LOG.warn("No row found to get image from !!!");
return;
}
response.setContentType("image/" + mimeType + "; charset=windows-1252");
OutputStream os = response.getOutputStream();
InputStream is = image.getInputStream();
// copy blob to output
byte[] buffer = new byte[4096];
int nread;
while ((nread = is.read(buffer)) != -1) {
os.write(buffer, 0, nread);
}
os.close();
// Remove the temporary viewobject
vo.remove();
// Release the appModule
Configuration.releaseRootApplicationModule(am, false);
}
} |
Comme tu l'aurais remarqué cette sevlet accepte comme paramètre l'id de (l'utilisateur )
- Enfin sur la la page JSF l'image ressemble à ceci :
Code:
1 2 3 4 5
| <af:image shortDesc="#{bindings.EmployeePic.hints.tooltip}"
binding="#{backingBeanScope.backing_PeopleAlbum.inputText2}"
id="image"
source="/servlet1?id=#{bindings.EmployeeId.inputValue}"
inlineStyle="width:13%; height:42px;"/> |
A noter que la source de l'image n'est autre que le flux sortant du servlet (servlet1).
Désolé si ce n'est pas assez claire mais en cas de problème je serai là.
Bon travail :ccool: