2017-03-25 4 views
2

heruntergeladen werden. Ich möchte eine domänenübergreifende Anfrage stellen, um eine Datei von meiner Java-Webanwendung herunterzuladen. Ich bin mit dem CORS-Filter und haben die Konfiguration in meinem Deployment Descriptor (web.xml) enthalten:Die Datei konnte nicht mit CORS

 <filter> 
     <filter-name>CorsFilter</filter-name> 
     <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>CorsFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <filter> 

ich die Cross-Domain-URL in das href Attribut:

<a href="http:localhost:8080/MyProject/downloadAction.action?fileId=1">download</a> 

Wenn ich jetzt klicken Der Link, die ganze Seite wird umgeleitet und die Datei wird heruntergeladen. Kann ich wissen, wie ich das erreichen kann? Dank

Antwort

1

Ich konfrontiert ein ähnliches Problem vor einiger Zeit. Sie können die Datei nicht mit einer GET-Anfrage mit dem href-Attribut herunterladen, wie Sie in der Frage erwähnt haben. Stattdessen können Sie ein Formular einreichen, das in einen iframe eingebettet ist, wie vorgeschlagen here, und das Formular mit Ihrer Datei-ID als verstecktes Element absenden und es sollte den Download auslösen. Also Ihr Anker-Tag sind:

<a href="javascript:void(0)" onclick="downloadFile('+fileId+')">download</a> 

Jetzt ist Ihre fileId als Parameter an die Onclick JS-Funktion übergeben und definieren es wie folgt aus:

function downloadFile(fileId) { 
    let $iframe, iframeDoc, iframeHtml; 

    if(($iframe = $('#download_frame')).length === 0) { 
    $iframe = $('<iframe id="download_frame" + 
       ' style="display: none;" src="about:blank"></iframe>' 
       ).appendTo('body'); 
    } 

    iframeDoc= $iframe[0].contentWindow; 
    if (iframeDoc.document) { 
    iframeDoc= iframeDoc.document; 
    } 

    iframeHtml= '<html><head></head><body><form method="POST" action="http:localhost:8080/MyProject/downloadAction.action"><input type="hidden" name="fileId" value="'+fileId+'"></form></body></html>'; 

    iframeDoc.open(); 
    iframeDoc.write(iframeHtml); 

    $(iframeDoc).find('form').submit(); 

} 

Sie können für einzelne oder mehrere Dateien ähnlichen Ansatz verfolgen. Auch hinzufügen können Sie dies in Ihrer web.xml in der Filterkonfiguration enthalten:

<init-param> 
     <param-name>cors.allowed.headers</param-name> 
     <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,X-Test-Header,Cache-Control 
     </param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.exposed.headers</param-name> 
     <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials 
     </param-value> 
    </init-param> 
+1

Vielen Dank für Ihre Antwort. Ich werde versuchen, Ihre Antwort zu akzeptieren, wenn es funktioniert. –

+1

Das hat funktioniert. Genial! –

Verwandte Themen