I am experiencing some troubles adding some datastreams to my objects where the datastreams have filenames containing multibyte characters.
I have a series of PDF documents which I want to add to multiple objects as datastreams, a number of these PDF’s have filenames containing Japanese characters. I am constructing a URI and then posting that URI to my Fedora
instance. An example of one of my URI’s would be:
http://192.168.10.65:8080/fedora/objects/UNU:720/datastreams/%E6%97%A5%E6%9C%AC%E8%AA%9E-Test.pdf?controlGroup=M&dsLabel=My%20PDF%20Label&versionable=false&mimeType=application%2Fpdf&dsLocation=http%3A%2F%2Flocalhost%2Fingest%2F%E6%97%A5%E6%9C%AC%E8%AA%9E-Test.pdf
I am using CURL and PHP to perform the POST. In this example the file name is
日本語-test.pdf. When I POST this URI to the fedora instance I get the following error:
javax.ws.rs.WebApplicationException: org.fcrepo.server.errors.HttpServiceNotFoundException: [DefaultExternalContentManager] re turned an error. The underlying error was a org.fcrepo.server.errors.GeneralException
The message was "Error getting http://localhost/ing est/日本語-Test.pdf" .
at org.fcrepo.server.rest.BaseRestResource.handleException(BaseRestResource.java:172)
at org.fcrepo.server.rest.DatastreamResource.addOrUpdateDatastream(DatastreamResource.java:583)
at org.fcrepo.server.rest.DatastreamResource.addDatastream(DatastreamResource.java:358)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractReso urceMethodDispatchProvider.java:175)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:163)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:111)
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:71)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:111)
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:63)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:689)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:647)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:638)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:309)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:425)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:590)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.fcrepo.server.security.servletfilters.FilterRestApiFlash.doFilter(FilterRestApiFlash.java:79)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368)
at org.fcrepo.server.security.servletfilters.FilterSetup.doFilter(FilterSetup.java:247)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.fcrepo.server.security.servletfilters.FilterSetup.doFilter(FilterSetup.java:247)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.fcrepo.server.security.servletfilters.FilterSetup.doFilter(FilterSetup.java:247)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.fcrepo.server.security.servletfilters.FilterSetup.doFilter(FilterSetup.java:247)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.access.channel.ChannelProcessingFilter.doFilter(ChannelProcessingFilter.java:109)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.fcrepo.server.errors.HttpServiceNotFoundException: [DefaultExternalContentManager] returned an error. The underlying error w as a org.fcrepo.server.errors.GeneralException The message
was "Error getting http://localhost/ingest/日本語-Test.pdf" .
at org.fcrepo.server.storage.DefaultExternalContentManager.getExternalContent(DefaultExternalContentManager.java:155)
at org.fcrepo.server.storage.DefaultDOManager.doCommit(DefaultDOManager.java:1203)
at org.fcrepo.server.storage.SimpleDOWriter.commit(SimpleDOWriter.java:509)
at org.fcrepo.server.management.DefaultManagement.modifyDatastreamByReference(DefaultManagement.java:790)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.fcrepo.server.messaging.NotificationInvocationHandler.invoke(NotificationInvocationHandler.java:68)
at $Proxy4.modifyDatastreamByReference(Unknown Source)
at org.fcrepo.server.management.ManagementModule.modifyDatastreamByReference(ManagementModule.java:378)
at org.fcrepo.server.rest.DatastreamResource.addOrUpdateDatastream(DatastreamResource.java:527)
... 50 more
Caused by: org.fcrepo.server.errors.GeneralException: Error getting http://localhost/ingest/日本語-Test.pdf
at org.fcrepo.server.storage.DefaultExternalContentManager.get(DefaultExternalContentManager.java:184)
at org.fcrepo.server.storage.DefaultExternalContentManager.getFromWeb(DefaultExternalContentManager.java:326)
at org.fcrepo.server.storage.DefaultExternalContentManager.getExternalContent(DefaultExternalContentManager.java:149)
... 61 more
Caused by: java.lang.IllegalArgumentException: Invalid uri 'http://localhost/ingest/日本語-Test.pdf': escaped absolute path not valid
at org.apache.commons.httpclient.HttpMethodBase.<init>(HttpMethodBase.java:222)
at org.apache.commons.httpclient.methods.GetMethod.<init>(GetMethod.java:89)
at org.fcrepo.common.http.WebClient.get(WebClient.java:163)
at org.fcrepo.common.http.WebClient.get(WebClient.java:136)
at org.fcrepo.server.storage.DefaultExternalContentManager.get(DefaultExternalContentManager.java:172)
I have already set URIEncoding to UTF-8 in my server.xml and if I submit a different document without multibyte characters in their filename I have no problems. The main problem appears to be when Fedora attempts to actuire
the datastream from the dsLocation provided. In this example if I attempt to connect to
http://localhost/ingest/日本語-Test.pdf (via wget or links) I have no problem.
I have been searching through the archives and various other sites and the only piece of advice I have found is to configure URIEncoding. All my server locale values are set to UTF-8 and my JAVA_OPTS value includes -Dfile.encoding=UTF-8
Cheers,
Conor