3

現在、.NETSDKを使用してAmazonS3からファイルをダウンロードしています。現在、次のコードを使用しています(これらのファイルのみが許可されています)。

    With request
        .WithBucketName(bucketName)
        .WithKey(key)
    End With
    response2 = client.GetObject(request)
    Dim strReader As MemoryStream = New MemoryStream
    response2.ResponseStream.CopyTo(strReader)

    Response.ContentType = getContentType(key)
    Response.OutputStream.Write(strReader.GetBuffer, 0, strReader.GetBuffer.Length)
    Dim fileName As String = Path.GetFileName(key)
    Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName)
    Return ""

End Function
Private Function getContentType(ByVal fileToContent As String) As String
    Dim fileExtension As String = Path.GetExtension(fileToContent)
    Dim contentType As String
    Select Case fileExtension
        Case ".bmp"
            contentType = "image/bmp"
        Case ".png"
            contentType = "image/png"
        Case ".xlsx", ".xls"
            contentType = "application/vnd.ms=excel"
        Case ".jpg", ".jpeg", ".gif"
            contentType = "image/jpeg"
        Case ".pdf"
            contentType = "application/pdf"
        Case ".ppt", ".pptx"
            contentType = "application/vnd.ms-powerpoint"
        Case ".doc", ".docx"
            contentType = "application/msword"
        Case Else
            contentType = "text/plain"
    End Select
    Return contentType
End Function

私は2つの問題を抱えています:最初に、クライアントウィンドウでファイルを開こうとすると(MS Officeファイルの場合)ファイルが破損していると通知されますが、とにかく開くことができる場合もありますが、そうでない場合もあります。次に、ファイルに.pptxのような拡張子があり、コンテンツタイプに「PowerPoint」と言うと、ブラウザが「.ppt」や「.doc」のような拡張子を追加しようとしているようです。それを修正する方法はありますか?

編集:MS Officeファイルを開いたときに表示される実際のメッセージ:'PowerPointがPowerPointFile.pptで読み取り不可能なコンテンツを検出しました。このプレゼンテーションの内容を復元しますか?このプレゼンテーションのソースを信頼できる場合は、[はい]をクリックします。

4

3 に答える 3

3

GetBufferOK、#1については、MemoryStreamで使用しないでください。使用ToArray:

Dim bytes = strReader.ToArray()
Response.OutputStream.Write(bytes, 0, bytes.Length) 

GetBufferストリームに書き込まれたものではなく、バッファを返します。

.***x#2 については、 Office ドキュメントに別の MIME タイプを使用する必要があります。ここを参照してください。

于 2012-11-29T21:53:29.510 に答える
1

次のコードは、破損したファイルの警告を受け取ることなく、その場所からファイルを取得し、ブラウザーに自動的にダウンロードします。

using(var response = client.GetObjectAsync(request).Result) 
{
  using( var responseStream = response.ResponseStream )
  {

    Response.ContentType = response.Headers.ContentType;
    Response.AddHeader("Content-Length", response.Headers.ContentLength.ToString());
    Response.AddHeader("Content-Disposition", "attachment; filename=\"" + uri.Key + "\"");
    Response.ContentType = "application/octet-stream";
    
    var memoryStream = new MemoryStream();
    responseStream.CopyTo(memoryStream);
    
    Response.BinaryWrite(memoryStream.ToArray()); //All byte data is converting to files                                     
    
  }
}
于 2020-08-27T20:26:07.210 に答える