Images-endpointin käyttö

Yritän lähettää Android-sovelluksella kuvaa multiparttina Images-endpointiin. Toistaiseksi huonolla menestyksellä. Serveri vastaa koodilla 500. Olisiko jotenkin saatavissa tietoa, mikä lähetyksessä on pielessä, tai dokumentaatiota siitä, missä muodossa kuva pitäisi lähettää?

Hei, tässä on Luomuksen Liito-orovasovelluksen kuvien lähettämisen logiikka javascriptilla, jos siitä olisi hieman apua. Eniten kiinnostavat osat lienevät riviltä 18 alkava processImages-metodi, ja riveillä 96-129 muokataan kuvat processImagesilla, lastataan ne multipart/form-dataan ja lähetetään.

Olisiko muuten HTTP 500 vastauksen bodyssa jokinlainen virheilmoitus?

Esko / Lajitietokeskus

Kiitos, tuosta on jo paljon apua. Ihmetyttää kuitenkin se, että form-dataan näytetään lisättävän JSON-objekti muotoa {uri, name, size, type}, mutta ei itse lähetettävää tiedostoa jossakin muodossa enkoodattuna.

Muistaakseni vastauksena tulee sama data, mikä tulisi “GET Images” requestiin. Koodi vain on 200:n sijasta 500. Pitää vielä tarkistaa tuo, kun pääsen koneen äärelle.

Kyllä, se on vähän hämmentävä ja aiheutti aikoinaan vähän hämminkiä sovellusta tehdessä, mutta axios, tai sen pohjana kirjasto, osaa hakea datan lähetystä varten URI:n pohjalta.

Noniin, nyt sain parsittua virheilmoituksenkin näkyviin:

Apache Tomcat/7.0.76 - Error report

HTTP Status 500 - java.lang.NullPointerException


type Exception report

message java.lang.NullPointerException

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: java.lang.NullPointerException
    	org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:487)
    	org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:425)
    	org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:383)
    	org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:336)
    	org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:223)
    	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    

root cause

java.lang.NullPointerException
    	fi.luomus.kuvapalvelu.resource.FileUpload.processPart(FileUpload.java:54)
    	fi.luomus.kuvapalvelu.resource.FileUpload.upload(FileUpload.java:45)
    	sun.reflect.GeneratedMethodAccessor138.invoke(Unknown Source)
    	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	java.lang.reflect.Method.invoke(Method.java:498)
    	org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
    	org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144)
    	org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161)
    	org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:205)
    	org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
    	org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
    	org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
    	org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
    	org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326)
    	org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
    	org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
    	org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    	org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    	org.glassfish.jersey.internal.Errors.process(Errors.java:267)
    	org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
    	org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
    	org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
    	org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:471)
    	org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:425)
    	org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:383)
    	org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:336)
    	org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:223)
    	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.j

String originalFileName = bodyPart.getContentDisposition().getFileName();
// encoding hack
originalFileName = new String(originalFileName.getBytes(Charsets.ISO_8859_1), Charsets.UTF_8); ← NullPointer tulee tästä

Elikkäs image api olettaa, että multipart boypartin headereissa on

Content-Disposition: attachment; filename=“image.jpg”; name=“file1”

(En ole ihan varma pitäisikö ensimmäisen arvon olla form-data vai attachment, mutta tuo filename on se puuttuva kohta)

Korjaan kuvapalvelua siten, että ei kaadu jos tiedostonimi puuttuu. Mutta tuota headeria säätämällä pitäisi päästä heti eteenpäin. Fiksin päätymisessä tuotantoon menee jonkin aikaa…

Noniin, nyt lähti toimimaan.

Vika taisi olla siinä, että yritin lähettää ensimmäisessä bodypartissa tageja itse kuvan sijaan, joten tietenkään filenamea ei siitä löytynyt.

Suuret kiitokset teille molemmille avusta!

Tässä vielä tuo toimiva headeri:

Content-Disposition: form-data; name="pic"; filename="1612385293939.jpg"
Content-Type: image/jpeg
1 tykkäys