2

多くのオンラインリソースを調べてスクリプトを作成しましたが、それでもファイルが表示されないようです。コードを実行してファイルを配信する代わりに、「client-home2.aspx/downloadAttachment」ページをロードするだけです。

これが私の背後にあるコードです:

    [WebMethod]
    public void downloadAttachment(string id)
    {

        DbProviderFactory dbf = DbProviderFactories.GetFactory();
        using (IDbConnection con = dbf.CreateConnection())
        {
            string sSQL;
            sSQL = "select top 1                " + ControlChars.CrLf
                 + " FILENAME, FILE_MIME_TYPE, ATTACHMENT" + ControlChars.CrLf
                 + "  from vwATTACHMENTS_CONTENT" + ControlChars.CrLf
                 + " where 1 = 1                    " + ControlChars.CrLf;
            //Debug.Print(sSQL);
            using (IDbCommand cmd = con.CreateCommand())
            {
                cmd.CommandText = sSQL;

                Sql.AppendParameter(cmd, id.ToString(), "ATTACHMENT_ID");

                cmd.CommandText += " order by DATE_ENTERED desc" + ControlChars.CrLf;

                using (DbDataAdapter da = dbf.CreateDataAdapter())
                {
                    ((IDbDataAdapter)da).SelectCommand = cmd;
                    using (DataTable dt = new DataTable())
                    {
                        da.Fill(dt);

                        if (dt.Rows.Count > 0)
                        {

                            foreach (DataRow r in dt.Rows)
                            {
                                string name = (string)r["FILENAME"];
                                string contentType = (string)r["FILE_MIME_TYPE"];
                                Byte[] data = (Byte[])r["ATTACHMENT"];

                                // Send the file to the browser
                                Response.AddHeader("Content-type", contentType);
                                Response.AddHeader("Content-Disposition", "attachment; filename=" + name);
                                Response.BinaryWrite(data);
                                Response.Flush();
                                Response.End();
                            }

                        }
                        else
                        {

                        }
                    }
                }
            }

        }

    }

これが私のjQueryです:

$('.attachmentLink').click(function () {
    var id = $(this).attr('id');
    /*
    $.ajax({
    type: "POST",
    url: "client-home2.aspx/downloadAttachment",
    data: '{id:\'' + id + '\'}',
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (msg) {
    //alert(msg.d);
    }
    });
    */
    $.download('client-home2.aspx/downloadAttachment', 'id=' + id);
    return false;
});

私はこの関数を使用していますhttp://filamentgroup.com/lab/jquery_plugin_for_requesting_ajax_like_file_downloads/

問題は、ファイルが提供されないことです。に移動するだけclient-home2.aspx/downloadAttachmentです。

ファイルをダウンロードできるように、この問題を解決するにはどうすればよいですか?

ありがとうございました。

4

3 に答える 3

2

WebMethod 呼び出しごとに 1 つの HTTP 応答のみを送信できます。つまり、一度に 1 つのファイルのみです。を使用Response.End()すると、他のものが Web ブラウザーに返されなくなり、foreach ループで 2 回目に例外がスローされる可能性があります。これを回避する唯一の方法は、jQuery コードから WebMethod を 20 回呼び出し、クエリに複数の結果がある場合に毎回どのファイルを返すかを引数で指定することです。それでもうまくいかないかもしれません。

しかし、ID フィールドが 1 つのレコードだけになるように本当に意図していたのではないかと思います。その場合、2つのことに注意する必要があります。1 つ目は、プロパティを変更すると SqlCommand 型がその Parameters コレクションをリセットすることですCommandText。したがって、 ID パラメータを追加する前に、SQL 文字列テキスト全体の作成を完了する必要があります。2 つ目は、SQL コードがそのパラメーターを参照することはないため、ID パラメーターは今のところ重要ではないということです。

他にも間違っている可能性があるため、このコードを投稿するのをためらっていますが、これはあなたが持っているものよりも改善されるはずです. 私も同じ仕事をすることになったことに注意してください

[WebMethod]
public void downloadAttachment(string id)
{

    string SQL =
          "select top 1 FILENAME, FILE_MIME_TYPE, ATTACHMENT" + ControlChars.CrLf
        + "  FROM vwATTACHMENTS_CONTENT" + ControlChars.CrLf
        + " where ID = @ATTACHMENT_ID" + ControlChars.CrLf
        + " order by DATE_ENTERED desc";
    //Debug.Print(SQL);

    DbProviderFactory dbf = DbProviderFactories.GetFactory();
    using (IDbConnection con = dbf.CreateConnection())
    using (IDbCommand cmd = con.CreateCommand())
    {
        cmd.CommandText = SQL;
        Sql.AppendParameter(cmd, id, "ATTACHMENT_ID");

        using (IDataReader rdr = cmd.ExecuteReader())
        {
            if (rdr.Read())
            {
                // Send the file to the browser
                Response.AddHeader("Content-type", r["FILE_MIME_TYPE"].ToString());
                Response.AddHeader("Content-Disposition", "attachment; filename=" + r["FILENAME"].ToString());

                Response.BinaryWrite((Byte[])r["ATTACHMENT"]);

                Response.Flush();
                Context.ApplicationInstance.CompleteRequest();
            }
        }
    }
}
于 2013-02-14T20:33:11.503 に答える
0

私はそれを考え出した。ヘッダーはすでに送信されていたので、別のファイルを作成する必要がありました。したがって、私の別のファイルは「downloadAttachment」と呼ばれ、次のようになります。

using System;
using System.Data;
using System.Data.Common;
using System.Configuration;
using System.Drawing;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Globalization;
using System.Threading;
using System.Diagnostics;
using System.Net;
using System.Net.Mail;
using System.Data.SqlClient;
using System.Web.Services;
using System.Text;
using System.Web.Script.Services;
using System.Text.RegularExpressions;
using System.IO;

namespace SplendidCRM.WebForms
{
    public partial class downloadAttachment : System.Web.UI.Page
    {
        string HostedSite;
        protected DataView vwMain;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Sql.IsEmptyGuid(Security.USER_ID))
                Response.Redirect("~/Webforms/client-login.aspx");

            HostedSite = Sql.ToString(HttpContext.Current.Application["Config.hostedsite"]);

            string id = Request.QueryString["ID"].ToString();

            DbProviderFactory dbf = DbProviderFactories.GetFactory();
            using (IDbConnection con = dbf.CreateConnection())
            {
                string sSQL;
                sSQL = "select top 1                " + ControlChars.CrLf
                     + " FILENAME, FILE_MIME_TYPE, ATTACHMENT" + ControlChars.CrLf
                     + "  from vwATTACHMENTS_CONTENT" + ControlChars.CrLf
                     + " where 1 = 1                    " + ControlChars.CrLf;
                //Debug.Print(sSQL);
                using (IDbCommand cmd = con.CreateCommand())
                {
                    cmd.CommandText = sSQL;

                    Sql.AppendParameter(cmd, id.ToString(), "ATTACHMENT_ID");

                    cmd.CommandText += " order by DATE_ENTERED desc" + ControlChars.CrLf;

                    using (DbDataAdapter da = dbf.CreateDataAdapter())
                    {
                        ((IDbDataAdapter)da).SelectCommand = cmd;
                        using (DataTable dt = new DataTable())
                        {
                            da.Fill(dt);

                            if (dt.Rows.Count > 0)
                            {

                                foreach (DataRow r in dt.Rows)
                                {
                                    string name = (string)r["FILENAME"];
                                    string contentType = (string)r["FILE_MIME_TYPE"];
                                    Byte[] data = (Byte[])r["ATTACHMENT"];

                                    // Send the file to the browser
                                    Response.AddHeader("Content-type", contentType);
                                    Response.AddHeader("Content-Disposition", "attachment; filename=" + MakeValidFileName(name));
                                    Response.BinaryWrite(data);
                                    Response.Flush();
                                    Response.End();
                                }

                            }
                            else
                            {

                            }
                        }
                    }
                }

            }

        }

        public static string MakeValidFileName(string name)
        {
            string invalidChars = Regex.Escape(new string(System.IO.Path.GetInvalidFileNameChars()));
            string invalidReStr = string.Format(@"[{0}]+", invalidChars);
            string replace = Regex.Replace(name, invalidReStr, "_").Replace(";", "").Replace(",", "");
            return replace;
        }

    }
}
于 2013-02-14T21:54:34.680 に答える
0

これは私が過去に行った方法ですが、別の方法で行ったのは次のとおりです。

意見:

foreach (var file in foo.Uploads)
  {
      <tr>
        <td>@Html.ActionLink(file.Filename ?? "(no filename)", "Download", "Upload", new { id = file.UploadId }, null)</td>
      </tr>
  }

UploadConroller のコード ビハインド:

public ActionResult Download(Guid id)
{
    var upload = this.GetUpload(id);
    if (upload == null)
    {
        return NotFound();
    }

    return File(upload.Data, upload.ContentType, upload.Filename);
}


private Upload GetUpload(Guid id)
{
    return (from u in this.DB.Uploads
            where u.UploadId == id
            select u).SingleOrDefault();
}

これはとても簡単です。

于 2013-02-14T20:37:35.107 に答える