2015-10-09 64 views
16

私は、角度$ httpを使ってファイルをダウンロードするコードを書いています。ファイルの名前はではなく、URLにと指定されています。 URLには、ファイルのユニークな識別子が含まれています。この識別子は、アプリケーションの外部から取得されます。

$http.get(myUrl)が呼び出されると、すべて正常に動作します。ファイルが取得され、コールバックハンドラでアクセスできますが、ファイルの名前を取得する方法はわかりません。フィドラーと生の応答をキャプチャ、私はこれを参照してください。以上のことから

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Length: 54 
Content-Type: application/octet-stream 
Server: Microsoft-IIS/8.5 
Access-Control-Allow-Origin: http://www.example.com/getFile/12345 
Access-Control-Allow-Credentials: true 
Content-Disposition: attachment; filename=testfile.txt 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Fri, 09 Oct 2015 20:25:49 GMT 

Lorem ipsum dolar sit amet! The contents of my file! 

を、サーバーが「コンテンツ・処分」にファイルの名前を返送されることは明らかであるが、私は見つかっていませんとにかく私の角度コールバック内でそれにアクセスする。ヘッダーからファイルの名前を取得するにはどうすればよいですか?以下の答えに応答して

編集: 私はすでにresponse.headers()を試してみましたその前に言及している必要があります。 Object {content-type: "application/octet-stream", cache-control: "private"}を返すので、何らかの理由でContent-Dispositionを取得できません。 response.headers('Content-Disposition')nullを返します。

+0

あなたは解決策を見つけましたか@andrewの回答は完璧です – spankmaster79

+0

?私はまったく同じ問題を抱えています:Fiddlerは正しいコンテンツ処理ヘッダーを明確に示していますが、以下の解決策はありません:response.headers( 'Content-Disposition')がNULLを返します – fikkatra

+0

私はそれを特定の私がやっていた仕事ですが、私は良い一般的な答えはありません。 –

答えて

5

使用response.headers HTTPレスポンスヘッダを取得する:たぶんあなたは既に解決策を見つける

$http.get(myUrl).then(function (response) { 
    // extract filename from response.headers('Content-Disposition') 
} 
+0

私はすでにこれを試しました。私は前にそれを言及していたはずなので、私はこれを私の質問に追加しました。 –

+3

実際、ヘッダーは 'Access-Control-Expose-Headers:Content-Disposition'で公開する必要があります。これは、あなたがサーバー側の応答を制御していることを前提としています。 –

+0

これを理解することに問題があります。 「プリフライト」レスポンスまたは実際のファイルを含むレスポンスに「Access-Control-Expose-Headers」が必要ですか? –

4

が、他の誰かがこの問題を持っている場合、私はこの回答を掲載します。

$のHTTPリクエストから成功のコールバック関数の中で、これらのパラメータを追加します。

$http.get(myUrl).success(function (data, status, headers, config) { 
     // extract filename from headers('Content-Disposition') 
    }); 
26

HTTPヘッダからファイル名を取得するためには、Content-Dispositionヘッダを抽出することは十分ではないことを言及する価値があるかもしれません。 このヘッダー値からfilenameプロパティを取得する必要があります。

返されるヘッダー値の例:attachment; filename="myFileName.pdf"

以下の関数はfilename="myFileName.pdf"を抽出し、次に"myFileName.pdf"を抽出し、最後に余分な引用符を削除してmyFileName.pdfを取得します。

あなたは以下のスニペットを使用することができます:あなたはCORSを使用している場合

function getFileNameFromHttpResponse(httpResponse) { 
     var contentDispositionHeader = httpResponse.headers('Content-Disposition'); 
     var result = contentDispositionHeader.split(';')[1].trim().split('=')[1]; 
     return result.replace(/"/g, ''); 
    } 
8

を、あなたは、サーバー側でレスポンスヘッダに「アクセス・コントロール・公開・ヘッダ」を追加する必要があります。例:Access-Control-Expose-Headers: x-filename, x-something-else

+1

あなたは部分的に真です。 CORSの場合、サーバはヘッダーを 'Access-Control-Expose-Headers:Content-Disposition'として送信する必要があります。 –

1

response.headers('Content-Disposition')がnullを返す場合は、response.headers.**get**('Content-Disposition');を使用します。

残りの@ andrewのスニペットはすばらしい作品です。

let fileName = parseFilenameFromContentDisposition(response.headers('Content-Disposition')); 

function parseFilenameFromContentDisposition(contentDisposition) { 
    if (!contentDisposition) return null; 
    let matches = /filename="(.*?)"/g.exec(contentDisposition); 

    return matches && matches.length > 1 ? matches[1] : null; 
} 
0

は、私が代わりにそれを解決する方法である私が発見した(ExecuteAsyncに次のコード行を追加しています...)私のIHttpActionResult実装の方法は、(「応答」を働いていた)が返されるHttpResponseMessageです:

response.Content.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition"); 

角度:次のように私は(「応答」があり、その後の角度でファイル名を解決することができましたresponse.headers( 'Content-Disposition')がnullを返す場合は、明らかに何か間違っています。$ http.getからの約束を解決しました):

var contentDisposition = response.headers('Content-Disposition'); 
var filename = contentDisposition.split(';')[1].split('filename')[1].split('=')[1].trim(); 
1

のWeb APIを::上記の答えの一部が、基本的な正規表現を使用した場合と同様

関連する問題