Has anyone encounter the error popup while downloading the attachment uploaded on access request

We have enabled the attachment functionality for access requests in our environment and have configured the attachment criteria, including the maximum number of attachments per item, maximum file size (MB), and supported file types.

When a request is submitted with a file that meets the configured criteria and supported file formats, the request is submitted successfully. However, when the approver attempts to download the attachment from the work item, they encounter the error shown below.

“Download Failed-There was an error during file download.”

We have tested multiple scenarios of but all ended with same error. When we are hitting download icon in syslog we are getting the below error:

javax.ws.rs.NotFoundException: HTTP 404 Not Found
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:252)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:234)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:684)
at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:366)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:319)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:199)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at sailpoint.web.SailPointResponseFilter.doFilter(SailPointResponseFilter.java:100)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at sailpoint.rest.jaxrs.MethodOverrideFilter.doFilter(MethodOverrideFilter.java:90)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at sailpoint.rest.RestCsrfValidationFilter.doFilter(RestCsrfValidationFilter.java:71)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at sailpoint.rest.AuthenticationFilter.doFilter(AuthenticationFilter.java:109)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at sailpoint.web.SailPointContextRequestFilter.doFilter(SailPointContextRequestFilter.java:68)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at sailpoint.web.SailPointPollingRequestFilter.doFilter(SailPointPollingRequestFilter.java:158)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at sailpoint.web.ResponseHeaderFilter.doFilter(ResponseHeaderFilter.java:63)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:388)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
at java.base/java.lang.Thread.run(Thread.java:833)

====================================
Current IIQ Version : 8.5p1

@NILESHPANDEY have you made any customization to your web.xml file inside WEB-INF folder? Could you please share your web.xml and confirm if below entries are available or not:

  <servlet>
    <servlet-name>Attachment Servlet</servlet-name>
    <servlet-class>sailpoint.web.attachment.AttachmentServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Attachment Servlet</servlet-name>
    <url-pattern>/ui/rest/attachment/*</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Attachment Servlet</servlet-name>
    <url-pattern>/ui/rest/export/attachment/*</url-pattern>
  </servlet-mapping>

Hi @NILESHPANDEY , the NotFoundException is interesting because it may mean the download request isn’t reaching the attachment resource at all, rather than the attachment simply being missing.

Could you open Developer Tools → Network, click the download icon again, and share (hostname and sensitive values masked):

  • the exact request URL/path (/identityiq/rest/attachment/<id>)
  • the HTTP status
  • the response body

Also enable trace for:


logger.attachmentResource.name=sailpoint.rest.AttachmentResource
logger.attachmentResource.level=trace

logger.attachmentAuth.name=sailpoint.authorization.AttachmentsAuthorizer

logger.attachmentAuth.level=trace

Then share the lines around the download. If there’s no Entering getFile(attachmentId=...) line, the request is not reaching the resource, so we’d look at the URL, proxy or customizations. If there is one, the exit status tells us whether it’s a missing attachment (404) or an authorization problem (403).

Hello Nilesh. Both suggestions above are useful. Since the request submits successfully but the approver gets 404 on download, I would first pin down where the download request is failing before changing anything.

I would check it in this order:

  1. As Pujan suggested, capture the failing request in Browser DevTools → Network and note the exact URL/path, HTTP status, and response body.
  2. Enable trace on sailpoint.rest.AttachmentResource and reproduce it. If the request never reaches the resource, I would focus on routing, the proxy or load balancer, web.xml, and any web-tier customizations. If it does reach the resource and still returns 404, I would then focus on how the requested attachment is being resolved.
  3. For Neel’s web.xml point, compare your deployed IdentityIQ_HOME/WEB-INF/web.xml with the stock file from the same 8.5p1 WAR rather than manually adding mappings from another version. If there are attachment-related differences, restore them from the same build. If IIQ is behind a proxy, also test the same path directly against the application server to rule the proxy in or out.
  4. If the request reaches AttachmentResource but still returns 404, verify that the attachment ID being requested still exists and is associated with the submitted request item.

IIQ documentation notes that attachments can exist without being associated with an access request, so the association is worth confirming once you know the request is reaching the attachment resource.

IdentityIQ Configuration - access request attachments