Windows下载Amazon S3对象表示文件已损坏
我目前使用.NET SDK从Amazon S3下载文件,我目前有以下代码来执行此操作(只允许这些文件):
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
我有两个问题:第一,当我尝试打开客户端窗口上的文件时告诉我(对于MS Office文件)文件已损坏,有时会设法打开它们,有时不会。 其次,如果我的文件有类似.pptx的扩展名,并且我在内容类型中说'PowerPoint',那么浏览器似乎会试图向它们附加一个扩展名,如'.ppt'或'.doc'。 有什么办法解决这个问题?
编辑:我打开MS Office文件时得到的实际消息:'PowerPoint在PowerPointFile.ppt中发现无法读取的内容。 你想恢复本演示文稿的内容吗? 如果您信任此演示文稿的来源,请单击是。
好的,对于#1,不要在MemoryStream上使用GetBuffer
。 使用ToArray
:
Dim bytes = strReader.ToArray()
Response.OutputStream.Write(bytes, 0, bytes.Length)
GetBuffer
返回缓冲区,而不是写入流的内容。
对于#2,您需要为.***x
Office文档使用不同的MIME类型。 看这里。
上一篇: Downloading Amazon S3 objects, Windows says files are corrupted