Erstellen und zeigen Sie Miniaturansichten (byte[]) in JSF
Bin ich mit dem hochladen zum server und wenn " Bild hochgeladen wird soll es mir zeigen, ein Daumen von hochgeladenen Bild. Die Miniaturansicht wird nicht gespeichert auf der Festplatte, die ich verwenden InputStream und Ausgabestrom. Für den upload ich bin ustig tomahawk.
meinem index.jsp:
<h:form id="uploadForm" enctype="multipart/form-data">
<t:inputFileUpload id="fileupload"
accept="image/*"
storage="file"
value="#{fileUpload.uploadedFile}"
styleClass="fileUploadInput"
required="true"
validator="epacient.FileUploadValidator"
requiredMessage="Obvezna izbira datoteke."
/>
<br />
<h:message for="fileupload" infoStyle="color: green;"
errorStyle="color: red;" />
<br />
<h:commandButton value="Upload" id="fileUploadButton"
action="#{fileUpload.upload}" />
<h:message for="uploadForm" style="color: red;" />
<h:graphicImage value="#{fileUpload.thumb}"
rendered="#{fileUpload.uploaded}" />
</h:form>
fileUpload.laden ruft die Funktion String preview()
private String thumb ;
public String preview() throws IOException{
HttpServletResponse response = (HttpServletResponse)FacesContext
.getCurrentInstance().getExternalContext().getResponse();
try {
FacesContext context = FacesContext.getCurrentInstance();
Map requestMap = context.getExternalContext().getApplicationMap();
byte[] bytes = (byte[])(requestMap.get("fileupload_bytes"));
//returns byte[]
byte[] testByte = createThumbnail(bytes, 200);
//here thumbnail is created
} catch (Exception ex) {
ex.printStackTrace();
}
}
createThumbnail:
public static byte[] createThumbnail( byte[] orig, int maxDim) {
try {
ImageIcon imageIcon = new ImageIcon(orig);
Image inImage = imageIcon.getImage();
double scale = (double) maxDim / (double) inImage.getWidth(null);
int scaledW = (int) (scale * inImage.getWidth(null));
int scaledH = (int) (scale * inImage.getHeight(null));
BufferedImage outImage = new BufferedImage(scaledW, scaledH, BufferedImage.TYPE_INT_RGB);
AffineTransform tx = new AffineTransform();
if (scale < 1.0d) {
tx.scale(scale, scale);
}
Graphics2D g2d = outImage.createGraphics();
g2d.drawImage(inImage, tx, null);
g2d.dispose();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(outImage, "JPG", baos);
byte[] bytesOut = baos.toByteArray();
return bytesOut;
} catch (IOException e) {
System.out.println("Erro: " + e.getMessage());
e.printStackTrace();
}
return null;
}
Nun habe ich meinen Daumennagel, aber es ist in byte[]
kann jede Stelle sagen Sie mir, wie um zu zeigen, meinen Daumen mit <h:graphicImage>
tag? Oder ein anderer Weg.
Danke !
InformationsquelleAutor Zlatoroh | 2010-02-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Bildern zählt jeweils als ein separate Anfrage. Sie nicht Prozess beide die HTML-Antwort (JSF) und das Bild in einem einzigen request/response-Zyklus. Sie benötigen zum speichern des Bildes/thumb irgendwo in einem datenspeicher, der länger lebt als eine Anfrage, wie z.B. der server ist local disk file system (temp-Ordner? webcontent-Ordner?), oder eine Datenbank (temp-Tabelle?), oder in der Sitzung.
Ersten, ersetzen
durch
so, dass es generiert wie
(die
src
sollte nämlich der Punkt, um eine gültige URL)Erstellen Sie dann eine
HttpServlet
was ist abgebildet auf einemurl-pattern
von/thumbs/*
und implementierendoGet()
etwa wie folgt:Das ist es. Mehr servlet Hinweise können gefunden werden in dieser Artikel.
InformationsquelleAutor BalusC
Den
graphicImage
- tag erzeugt eineimg
- tag in die HTML-Antwort. So müssen Sie die URL eines Bildes in dievalue
Attribut desgraphicImage
tag, das entspricht dersrc
Attribut desimg
tag.Können Sie entweder:
filesystem
in einen Pfad, der zugänglich ist, bilden die außen über HTTP. Sie können dann darauf verweisen, das Bild direkt in denvalue
Attribut in dergraphicImage
z.B./myapp/thumbnail/12345
.servlet
dient das Bild, wenn gewünscht. Das servlet kann entweder Lesen Sie die Bild aus dem Speicher (HttpSession
), das Dateisystem oder eine Datenbank, oder erstellen Sie jedes mal. In diesem Fall müssen Sie übergeben Sie einen parameter an das servlet, z.B./myapp/thumbnail.do?filename=12345
Kurz gesagt, müssen Sie speichern Ihre
byte[]
thumbnail irgendwo (session, filesystem, Datenbank), um in der Lage sein, es zu dienen, als regelmäßige Ressource, entweder direkt oder über ein servlet.InformationsquelleAutor ewernli
Richfaces hat, abstrahiert diese für Sie. Überprüfen Sie
<a4j:mediaOutput>
- Sie schreiben einfach Ihrebyte[]
zu einemOutputStream
zur Verfügung gestellt, die von der Komponente.InformationsquelleAutor Bozho
Dank ewernli. Ich habe wiederverwendet Ihrem createThumbnail util-Methode. Ich fügte hinzu, diese kleine Verbesserung ein, so dass das ursprüngliche Bild wird zurückgegeben, wenn dessen Breite kleiner ist als die vereinbarte maxDim Breite. Ich Tat dies, weil ich lief in einer situation, wo die Methode zurückgegeben wird ein Bild, das größer war als das original, gepolstert und mit schwarzen Pixeln.
InformationsquelleAutor Sorcha