-3

現在、ダウンロードボタンを作成する必要があるプロジェクトに取り組んでいます。すべて正常に動作しますが、ファイルをダウンロードするときにしか [保存] または [名前を付けて保存] をクリックできません。[開く] をクリックしても何も起こりません。なぜですか?

string path = filePath.ToString();
FileInfo file = new FileInfo(path);
if (file.Exists)
{
    Response.Clear();
    Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
    Response.AddHeader("Content-Length", file.Length.ToString());
    Response.ContentType = "application/msword"; //octet-stream
    Response.WriteFile(file.FullName);
    Response.End();
}

更新 *保存のみを開くには機能しません

private void SetWordDocument()
{
    string strFileName = CleanUp(LabelFirstName.Text + "_" +
                                 LabelLastName.Text + "_" +
                                 DateTime.Now.ToString("yyyy-MM-dd") + "." + 
                                 DropDownListDownloadCv0.SelectedItem.Text);

    object fs = Server.MapPath("~/Upload/") + strFileName;

    using (var db = new knowitCVdbEntities())
    {
        var theEmpl = (from p in db.EMPLOYEES
                       where p.username == strUserName
                       select p).FirstOrDefault();

        if (theEmpl != null)
        {        
            object missing = Missing.Value;
            object start1 = 0;
            var wordApp = new ApplicationClass();
            var myDoc = wordApp.Documents.Add(ref missing, ref missing, ref missing, ref missing);

            object doNotSaveChanges = WdSaveOptions.wdDoNotSaveChanges;
            Range rng = myDoc.Range(ref start1, ref missing);

            try
            {
                const char newLine = (char)11;
                myDoc.SaveAs(ref fs,
                    ref missing, ref missing, ref missing, ref missing, ref missing,
                    ref missing, ref missing, ref missing, ref missing, ref missing,
                    ref missing, ref missing, ref missing, ref missing, ref missing);
            }
            finally
            {

                    myDoc.Save();

                    //myDoc.Close(ref doNotSaveChanges, ref missing, ref missing);
                   wordApp.Quit(ref doNotSaveChanges,ref missing,ref missing);

                   myDoc = null;
                   wordApp = null;

                   System.Runtime.InteropServices.Marshal.ReleaseComObject(myDoc); 

                   System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);  



                    GC.Collect();

                System.IO.Stream iStream = null;

                // Buffer to read 10K bytes in chunk:
                byte[] buffer = new Byte[10000];

                // Length of the file:
                int length;

                // Total bytes to read:
                long dataToRead;

                // Identify the file to download including its path.
                string filepath = fs.ToString();

                // Identify the file name.
                string filename = System.IO.Path.GetFileName(filepath);

                try
                {
                    // Open the file.
                    iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
                        System.IO.FileAccess.Read, System.IO.FileShare.Read);

                    // Total bytes to read:
                    dataToRead = iStream.Length;

                    Response.ContentType = "application/msword";
                    Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
                    //application/octet-stream
                    // Read the bytes.
                    while (dataToRead > 0)
                    {
                        // Verify that the client is connected.
                        if (Response.IsClientConnected)
                        {
                            // Read the data in buffer.
                            length = iStream.Read(buffer, 0, 10000);

                            // Write the data to the current output stream.
                            Response.OutputStream.Write(buffer, 0, length);

                            // Flush the data to the HTML output.
                            Response.Flush();

                            buffer = new Byte[10000];
                            dataToRead = dataToRead - length;
                        }
                        else
                        {
                            //prevent infinite loop if user disconnects
                            dataToRead = -1;
                        }
                    }
                }
                catch (Exception ex)
                {
                    // Trap the error, if any.
                    Response.Write("Error : " + ex.Message);
                }
                finally
                {
                    if (iStream != null)
                    {
                        //Close the file.
                        iStream.Close();
                    }
                    Response.Close();
                }

私は何を忘れましたか?

4

1 に答える 1

0

ラインを外しますResponse.AddHeader("Content-Length", file.Length.ToString());

rfc2616に従ってください:

Content-Length エンティティ ヘッダー フィールドは、受信者に送信されたエンティティ ボディのサイズを OCTET の 10 進数で示します。HEAD メソッドの場合は、送信されたエンティティ ボディのサイズが示されます。リクエストはGETでした。

この助けを願っています。

編集

ちなみに、filePathここで使用する変数がすでに適用されてServer.MapPathおりfile.Name、空白が含まれていないことを確認する必要があります。

EDIT2

あなたのコメントに基づいて、実際には良い解決策ではなく、動作が遅く、ここでResponse.WriteFile参照できる大きなファイルに多くの問題があります。以下のリンクに従って応答ストリームを適用し、ファイルをストリームごとに読み取り、それをメモリに入れ、以下のリンクとしてクライアントに送り返す必要があります。

WebResponse をメモリ ストリームに入れるにはどうすればよいですか?

また

http://forums.asp.net/t/1794834.aspx/1

編集3:

ここに投稿されたコードはまだ Ms Word を正しくリリースしていません。ドキュメントを保持しているため、コメントとして例外が発生しました。

問題を解決するには、以下のリンクに従ってください。

Microsoft.Office.Interop.Word.Application の破棄

または

http://code.msdn.microsoft.com/office/CSAutomateWord-f422cae5

于 2013-05-03T16:48:49.657 に答える