Java EE + primefaces + jboss - upload plików na serwer

Java EE + primefaces + jboss - upload plików na serwer
Bartosz Rędziniak
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:16
0

Cześć,

piszę sobie mały webowy projekt w Javie i mam ogromny problem z wysyłaniem plików na serwer. Dokładnie to wrzucanie obrazków przy dodawaniu artykułów na stronie. Szukałem w internetach parę godzin i z żadnych poradników ani for nie byłem w stanie skonstruować niczego działającego.

Zastanawiam się też czy wrzucanie tych obrazków do folderu WebContent/resources/... będzie odpowiednim rozwiązaniem? Jak nie to gdzie je wrzucać i jak je potem wyświetlić na stronie(jeżeli nie z resources bo stąd umiem).

**Bardzo, bardzo **proszę o pomoc, ja już z tym kompletnie wymiękam.

Chcę taki formularz:

Kopiuj
<h:form>
	[...]
	<p:fileUpload  mode="simple" skinSimple="true"/>
	<p:commandButton value="Zapisz" action="#{adminArticles.addArticle()}" />
</h:form>

Oraz taki adminArticles.java

Kopiuj
private UploadedFile uploadedFile;

 public String addArticle() throws IOException {
	Article article = new Article();
	article.setTitle(title);
	article.setContent(content);
	article.setDate(new Date());

        **Magiczny kod do zapisu pliku na serwer**

	article.setImg(**Tutaj bym chciał nazwę pliku z rozszerzeniem zapisać do bazy**);
	article.setUser(UserControl.getActualUser());

	try {
		articleDAO.create(article);
	} catch (Exception e) {
		e.printStackTrace();
		ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Błąd podczas zapisu.", null));
		return null;
	}
	return "/pages/admin/articlesList";
}
SP
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:127
0

Plik zapisuj w systemie plików, a w bazie tylko jego nazwę. Dodatkowo zmień nazwę pliku na wypadek gdyby ktoś wpisał jakieś chińskie znaki, np. haszując ją.
Plik możesz zapisać jakoś tak:

Kopiuj
<p:fileUpload value="#{fileUploadView.uploadedFile}" mode="simple" 
              allowTypes="/(\.|\/)(gif|jpe?g|png)$/" />

FileUploadView.java

Kopiuj
Files.copy( uploadedFile.getInputstream(), 
            Paths.get( destination_path, uploadedFile.getFileName()));

a wyświetlać tak:

Kopiuj
<p:graphicImage value="#{someView.imgfile}" />

SomeView.java:

Kopiuj
import org.primefaces.model.DefaultStreamedContent
imgfile= new DefaultStreamedContent( new FileInputStream("/path/img.png"));

Nazwę pliku możesz możesz zhashować tak:

Kopiuj
import org.apache.commons.codec.digest.DigestUtils;
String newfilename = DigestUtils.md5Hex( uploadedFile.getFileName());
edytowany 1x, ostatnio: student pro
Koziołek
> Plik zapisuj w systemie plików, a w bazie tylko jego nazwę. Najgorsze co można zrobić. Dlaczego? Zastanów się jak powinna wyglądać transakcja, która obsługuje tego typu procedurę.
SP
Mi się wydaje, że narzut na bazę przy blobach jest konkretny, baza musi zajmować się zapisem/odczytem do systemu plików, kopiowaniem do/z pamięci serwera WWW. Natomiast transakcyjność raczej rzadko kiedy jest problemem, zawsze można zapisać plik (i tak jest już gdzieś w tmp) na zewnątrz transakcji, jeśli przebiegła pomyślnie. Ew. chyba Apache Jackrabbit obsługuje XA
Koziołek
Ale i tak musimy zrobić IO, tak musimy przy odczycie wepchnąć to do pamięci. Bazy danych mają odpowiednie mechanizmy do tego zadania. Pierwszy post tutaj: https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1011065100346196442
vpiotr
Też bym wrzucił do pliku, ew. NoSQL. Transakcje przy obrazkach są bezużyteczne (jedyny rozsądny stan to albo jest obrazek albo go nie ma). A odtwarzanie katalogu z obrazkami na pewno będzie szybsze niż odtwarzanie bazy z obrazkami. (uwaga: piszę o obrazkach a nie o blobach specjalnie - XMLe np. całkiem fajnie działają w SQL).
Koziołek
@vpiotr: Jak miałem w zeszłym roku fakap na blogu, to do dziś nie odzyskałem obrazków w tekstach. I to nawet posiadając backup bazy danych. Poza tym stan nie jest zero-jedynkowy (jest jeszcze stan plik uszkodzony).
vpiotr
@Koziołek: jeśli oprócz tego korzystasz z bazy transakcyjnej to... jest - nie zapisujesz statusu "OK" w bazie dopóki cały zapis pliku się nie powiedzie. A obrazki z blogu powinny być w osobnym katalogu który jest backupowany (oprócz bazy, oprogramowania i logów). Jeśli jeszcze nie miałeś "defacement" to możesz się spodziewać prędzej czy później - chyba że używasz statycznego bloga.
Bartosz Rędziniak
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:16
0

Dzięki za odpowiedź, ale nadal mam problem. Niestety uploadedFile jest ciągle nullem, przez co mam nullPointerException, inne pola normalnie przekazują wartości do zmiennych(np. tytuł czy treść), a plik za nic nie chce.

articleAdd.xhtml

Kopiuj
 <h:form>
	<p:panel id="panel" header="Form" style="margin-bottom:10px;">
		<h:panelGrid columns="2" cellpadding="5">
			<p:outputLabel for="login" value="Tytuł:" />
			<p:inputText id="login" required="true" value="#{adminArticles.title}" />

			<h:outputLabel for="password" value="Treść:" />
			<p:editor id="password" required="true" value="#{adminArticles.content}" />

			<p:fileUpload value="#{adminArticles.uploadedFile}" mode="simple" allowTypes="/(\.|\/)(gif|jpe?g|png)$/" />

			<p:commandButton value="Zapisz" action="#{adminArticles.addArticle()}" />


		</h:panelGrid>
	</p:panel>
</h:form>

adminArticles.java

Kopiuj

private UploadedFile uploadedFile;

	public UploadedFile getUploadedFile() {
		return uploadedFile;
	}

	public void setUploadedFile(UploadedFile uploadedFile) {
		this.uploadedFile = uploadedFile;
	}

	public String addArticle() throws IOException {
		Article article = new Article();
		article.setTitle(title);
		article.setContent(content);
		article.setDate(new Date());		
		
		Files.copy(uploadedFile.getInputstream(), FileSystems.getDefault().getPath( "/lolek/", uploadedFile.getFileName()));
		
		article.setImg(uploadedFile.getFileName());
		article.setUser(UserControl.getActualUser());

		try {
			articleDAO.create(article);
		} catch (Exception e) {
			e.printStackTrace();
			ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Błąd podczas zapisu.", null));
			return null;
		}
		return "/pages/admin/articlesList";
	}

Konsola, po kliknięciu przycisku "wyślij":

Kopiuj
 
16:59:19,948 WARNING [javax.enterprise.resource.webcontainer.jsf.lifecycle] (default task-44) #{adminArticles.addArticle()}: java.lang.NullPointerException: javax.faces.FacesException: #{adminArticles.addArticle()}: java.lang.NullPointerException
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
	at security.SecurityCheckFilter.doFilter(SecurityCheckFilter.java:126)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
	at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
	at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
	at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:285)
	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:264)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:175)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:792)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: javax.faces.el.EvaluationException: java.lang.NullPointerException
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	... 39 more
Caused by: java.lang.NullPointerException
	at admin.adminArticles.addArticle(adminArticles.java:120)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at javax.el.ELUtil.invokeMethod(ELUtil.java:300)
	at javax.el.BeanELResolver.invoke(BeanELResolver.java:415)
	at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:256)
	at com.sun.el.parser.AstValue.invoke(AstValue.java:285)
	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
	at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
	at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
	... 40 more

16:59:19,949 SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (default task-44) javax.faces.el.EvaluationException: java.lang.NullPointerException
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
	at security.SecurityCheckFilter.doFilter(SecurityCheckFilter.java:126)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
	at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
	at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
	at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:285)
	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:264)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:175)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:792)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
	at admin.adminArticles.addArticle(adminArticles.java:120)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at javax.el.ELUtil.invokeMethod(ELUtil.java:300)
	at javax.el.BeanELResolver.invoke(BeanELResolver.java:415)
	at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:256)
	at com.sun.el.parser.AstValue.invoke(AstValue.java:285)
	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
	at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
	at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
	... 40 more
edytowany 1x, ostatnio: Bartosz Rędziniak
SP
Może aplikacja nie ma praw zapisu do katalogu? Możesz dać na wszelki wypadek chmod a+rwx /lolek
Bartosz Rędziniak
To nie kwestia uprawnień do /lolek, bo po prostu zmienna uploadedFile jest nullem, więc nawet nie mogę z tym zrobić. Swoją drogą mam Windowsa. I ta ścieżka to jest jaką ścieżką, względną wg. czego? Czy bezwzględną?
SP
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:127
0

Przykład ze strony Primefaces:
http://www.primefaces.org/showcase/ui/file/upload/basic.xhtml

Kopiuj
 <h:form enctype="multipart/form-data">
    <p:growl id="messages" showDetail="true" />
 
    <p:fileUpload value="#{fileUploadView.file}" mode="simple" skinSimple="true"/>
 
    <p:commandButton value="Submit" ajax="false" actionListener="#{fileUploadView.upload}" />
</h:form>

zwróć uwagę na enctype="multipart/form-data" i ajax=false

Bartosz Rędziniak
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:16
0

Super, teraz wysyłanie działa :)
Dzięki ogromne, ale zaś mam problem z wyświetleniem tego :D

Kopiuj
22:39:06,856 SEVERE [org.primefaces.application.resource.StreamedContentHandler] (default task-61) Error in streaming dynamic resource. java.io.FileNotFoundException: photos (Access is denied)

Ścieżka jest dobra, nazwa pliku przekazana dobra, java widzi plik - bo jak zmienię ścieżkę na jakąkolwiek niepoprawną to wywala wyjątek :) Strona się ładuje ale brak obrazka, tylko sama ikonka niezaładowanego obrazka. Niby brak dostępu, tylko jak to zmienić? Przyp. mam Windowsa 10 :)

Kopiuj
 public DefaultStreamedContent obrazek(String name) throws FileNotFoundException {
	System.out.println(name);
	return new DefaultStreamedContent( new FileInputStream("photos/" + name));
}
Kopiuj
<p:graphicImage value="#{articleListBB.obrazek(article.img)}" />

Ciekawe jest też ta metoda obrazek() wywołuje się 2 razy - wyświetla 2 razy nazwę pliku, lecz ten błąd jest wyświetlany w konsoli tylko raz.

SP
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:127
0

Możliwości są dwie, albo podajesz złą ścieżkę albo nie masz uprawnień.
Daj dla pewności 'article.img' w html w apostrofy i pełną ścieżkę do photos, będziesz miał przynajmniej pewność

Bartosz Rędziniak
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:16
0

To na pewno kwestia uprawnień, bo jak podaje inną ścieżkę to dostaję java.io.FileNotFoundExceptio, a jak podaje pełną to jest to co powyżej.
Tak więc jak dodać te uprawnienia dla Jboss-a? :O
Bo w samym Windowsie, w właściwościach folderu nadałem pełne uprawnienia wszystkim(swoją drogą nie wiedziałem że w systemie tym istnieje kilkadziesiąt userów/grup :O) i błąd nadal występuje - plik oczywiście również ma takie same - pełne uprawnienia.

SP
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:127
0

"Na moim komputerze działa" (windows7)

Kopiuj
<p:graphicImage value="#{image.obrazek('obrazek.gif')}" />
Kopiuj
@Named
@RequestScoped
public class Image {

    public DefaultStreamedContent obrazek(String name) 
            throws FileNotFoundException 
    {
        return new DefaultStreamedContent(new FileInputStream("D:\\obrazki\\" + name));
    }

}

Przyznaj, nie chciało ci się sprawdzić z tymi apostrofami, nie?

edytowany 1x, ostatnio: student pro
Bartosz Rędziniak
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:16
0

W taki sposób na sztywno u mnie też działa. Próbowałem z apostrofami, lecz przekazywałem w parametrze 'article.img' - a to nie działa.
Gdy chcę nazwę pliku z bazy to funkcja obrazek() zostaje wywołana 3 razy, dwukrotnie poprawnie, z dobrym parametrem, lecz za trzecim razem jest on pusty... więc ścieżka jest niekompletna. Dodam że jak korzystam z reszty informacji o artykule, np. article.content to są one normalnie bez problemu wyświetlane.

Kopiuj
00:18:12,528 INFO  [stdout] (default task-25) siec_kin.jpg
00:18:12,528 INFO  [stdout] (default task-25) C:\Users\Sasi\EAP-7.0.0\bin\photos\siec_kin.jpg // tutaj jest ok
00:18:12,529 INFO  [stdout] (default task-25) siec_kin.jpg
00:18:12,529 INFO  [stdout] (default task-25) C:\Users\Sasi\EAP-7.0.0\bin\photos\siec_kin.jpg // tutaj też jest ok
00:18:12,543 INFO  [stdout] (default task-26) 
00:18:12,543 INFO  [stdout] (default task-26) C:\Users\Sasi\EAP-7.0.0\bin\photos\ // a tu za trzecim razem coś zjada nazwę pliku, i nie wiem czemu, akurat to ostatnie wywołanie jest tym "wyświetlanym" 
SP
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:127
0

No to nie wiem :p
możesz też zrobić servlet albo jax-rs, akurat mam na dysku to Ci skopiuje:

servlet:

Kopiuj
@WebServlet("/images_servlet")
public class ImagesServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
              throws ServletException, IOException 
    {
        String filename = request.getParameter("imgname");
        Path path = Paths.get("d:/randomImages", filename);
        File file = path.toFile();
        response.setHeader("Content-Type", getServletContext().getMimeType( filename));
        response.setHeader("Content-Length", String.valueOf( file.length()));
        response.setHeader("Content-Disposition", "inline; filename=\"" + filename + "\"");
        Files.copy( path, response.getOutputStream());
    }

}

jax-rs:

Kopiuj
@javax.ws.rs.Path("/images_jaxrs")
public class ImageService {
    
	@GET
	@javax.ws.rs.Produces({"image/jpeg, image/gif, image/png"})
	public Response getFile( @QueryParam("imgname") String imgname) {
            Path path = Paths.get("d:/randomImages", imgname);
            Response.ResponseBuilder response = Response.ok( path.toFile());
            response.header("Content-Disposition", "inline; filename=\"" + imgname + "\"");
            return response.build();
	}
}
Kopiuj
<!-- servlet -->
<img src="images_servlet?imgname=obrazek.gif" />
<!-- jax-rs -->
<img src="webresources/images_jaxrs?imgname=obrazek.gif" />

albo odpowiednio używając facelets:

Kopiuj
<!-- servlet -->
<h:graphicImage value="images_servlet?imgname=obrazek.gif" />
<!-- servlet -->
<h:graphicImage value="webresources/images_jaxrs?imgname=obrazek.gif" /> 
edytowany 1x, ostatnio: student pro
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)