2009-07-16 38 views
5

fileContentResultを使用してファイルをブラウザにレンダリングしています。これは、fileNameに国際文字が含まれているときに例外をスローする点を除いて、うまく機能します。 私はこの機能が国際的な文字をサポートしていない場所を読んでいることを覚えていますが、アプリケーションが米国以外の国でファイルをアップロードする必要がある場合には回避策やベストプラクティスが必要であると確信しています。FileContentResultおよび各国語の文字

は?ここで事前に

public ActionResult GetFile(byte[] value, string fileName) 
    { 
     string fileExtension = Path.GetExtension(fileName); 
     string contentType = GetContentType(fileExtension); //gets the content Type 
     return File(value, contentType, fileName); 
    } 

感謝のActionResultメソッド

は誰もがそのような練習を知っています です

スーザン

答えて

6
public class UnicodeFileContentResult : ActionResult { 

    public UnicodeFileContentResult(byte[] fileContents, string contentType) { 
     if (fileContents == null || string.IsNullOrEmpty(contentType)) { 
      throw new ArgumentNullException(); 
     } 

     FileContents = fileContents; 
     ContentType = contentType; 
    } 

    public override void ExecuteResult(ControllerContext context) { 
     var encoding = UnicodeEncoding.UTF8; 
     var request = context.HttpContext.Request; 
     var response = context.HttpContext.Response; 

     response.Clear(); 
     response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", (request.Browser.Browser == "IE") ? HttpUtility.UrlEncode(FileDownloadName, encoding) : FileDownloadName)); 
     response.ContentType = ContentType; 
     response.Charset = encoding.WebName; 
     response.HeaderEncoding = encoding; 
     response.ContentEncoding = encoding; 
     response.BinaryWrite(FileContents); 
     response.End(); 
    } 

    public byte[] FileContents { get; private set; } 

    public string ContentType { get; private set; } 

    public string FileDownloadName { get; set; } 
} 
+0

FileDownloadNameにも国際的な文字がある場合は動作しますか? – RezaRahmati

+0

@rezarahmati残念ながら。しかし、国際的なファイル名については、この例を使用することができます:https://gist.github.com/AlexMAS/c874bc03bff8a2717e18 – AlexMAS

0

私はそれが国際文字を含むファイルをダウンロードすることはできないと思いますファイル名ファイル名はContent-dispositionヘッダーの一部で、すべてのHTTPヘッダーと同様に、すべてのブラウザーとプロキシで機能するASCII以外の別のエンコードを使用する方法はありません。私はそれがあなたのresponseHeaderEncodingに依存だと思う

ファイル名は、通常のフォームデータとして送信されるため、国際的な文字を持つファイルをアップロードするには、しかし、問題はないはず(application/www-url-encoded

+0

私はそれを知っていますが、いくつかのウェブサイトで試してみましたが、それはスウェーデン人のキャラクターでうまくいきますので、代わりの解決策が必要です。たとえば、ファイルをgmailに添付してダウンロードしても、それが国際的な文字を持っていてもそれはうまく機能します。私が考えることの1つは、ファイルを直接レスポンスにアタッチすることですが、MVCのクライアントにどのように送り返すのですか? – suzi167

+0

Googleがどのように動作するかをリバースエンジニアリングし、ActionResultから派生した独自のクラスを作成してください。必要なものを返すことができます(ASP.NETの許可によって制限されます)。 – chris166

0
public FileContentResult XmlInvoice(Order order) 
{ 
    string stream = order.Win1250StringData; 
    var bytes = Encoding.GetEncoding("windows-1250").GetBytes(stream); 
    var fr = new FileContentResult(bytes, "application/xml"); 
    fr.FileDownloadName = string.Format("FV{0}.xml", order.DocumentNumber); 
    return fr; 
} 

UTF-8またはWin1250からのバイトのサイズが異なります。正しいエンコーディングの文字列からバイトを取得することによって、文字列を正しく解釈する必要があります。

関連する問題