2017-09-29 8 views
2

私はビジュアルスタジオ15で作業しています。私のアプリケーションでは、サイズが6MBのファイルをアップロードする必要があります。私はEntity Framework 6で.Net 4.5.1を使用しています。ビジュアルスタジオからサイズが6MBのファイルをアップロードできません

ファイルのアップロードを選択してチェックするために、次のスクリプトとhtmlコードがビューレベルの剃刀で書かれています。

$('#SaveResponse').click(function() { 
var data = new FormData(); 
var files = $("#imagefile").get(0).files; 
    if (files.length > 0) { 
     data.append("UploadedImage", files[0]); 
    } 
    else 
    { 
     alert('You have not selected any File'); 
     return; 
    } 
      $.ajax({ 
       async: false, 
       cache: false, 
       type: "POST", 
       dataType: "json", 
       contentType: false, 
       processData: false, 
       url: "@(Url.RouteUrl("UploadFile"))", 
       data: data, 
       success: function (JsonCP) { 
         if (JsonCP.msg != null) { 
         if (JsonCP.msg.Key) { 
          alert(JsonCP.msg.Value); 
          $("#fileUpload").val(''); 
         } else 
          alert(JsonCP.msg.Value); 
         } 
        }, 
       error: function (JsonCP) { 
        alert(JsonCP.msg.Value); 
       } 
      }); 
     }); 

<table> 
    <tr> 
     <td align="right" width="200px">@Html.Label("Select the File:")</td> 
     <td align="left" width="200px"><input type="file" id="imagefile" /> 
     </td> 
    </tr> 
    <tr> 
    <td colspan="2" align="center"><input type="button" value="Save this 
    Response" id="SaveResponse" name="SaveResponse" /></td> 
    </tr> 
</table> 

次のコードは、ファイルをアップロードして適切なメッセージを表示するためにコントローラに書き込まれています。

[System.Web.Mvc.AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult UploadFile() 
    { 
     UploadResponseModel rm = new UploadResponseModel(); 
     try 
     { 
      if (System.Web.HttpContext.Current.Request.Files.AllKeys.Any()) 
      { 
       var httpPostedFile = 
      System.Web.HttpContext.Current.Request.Files["UploadedImage"]; 
       if (httpPostedFile != null) 
       { 
        string fileSavePath = 
      Path.Combine(HttpContext.Server.MapPath("~/UploadedFiles"), 
       Path.GetFileName(httpPostedFile.FileName)); 
        httpPostedFile.SaveAs(fileSavePath); 
        rm.responseModel.response.ResponseImage = 
         System.IO.File.ReadAllBytes(filesavePath) 
        if (rm.responseModel.insertResponse() != 1) 
         rm.msg = new KeyValuePair<bool, string>(false, 
          "row is not saved successfully."); 
        else 
         rm.msg=new KeyValuePair<bool,string>(true,"File 
          uploaded Successfully."); 
       } 
       else 
       rm.msg = new KeyValuePair<bool, string>(false, "Could not 
        get the file."); 
      } 
      else 
      rm.msg = new KeyValuePair<bool, string>(false, "No file found to 
           Upload."); 
     } 
     catch (Exception ex) 
     { 
    rm.msg = new KeyValuePair<bool, string>(false, "Can not Upload the 
     file: " + ex.Message); 
     } 
     return Json(rm, JsonRequestBehavior.AllowGet); 
    } 
    } 

次の関数は、ResponsesというSQLデータベーステーブルに行を挿入するために使用されます。

public int insertResponse() 
{ 
    using (Entities cntx = new Entities()) 
    { 
    cntx.Responses.Add(this.response);cntx.Entry(this.response). 
    State = System.Data.Entity.EntityState.Added; 
    int ex=cntx.SaveChanges(); 
    return ex; 
    } 
    } 

responseImageと呼ばれる応答テーブルの列の1つは、fileStreamのデータ型です。別の列は、uniqueIdentifier型です。テーブル作成SQLは以下の通りです。

CREATE TABLE [dbo].[Responses] (
[ResponseId]  UNIQUEIDENTIFIER   ROWGUIDCOL NOT NULL, 
[ResponseImage] VARBINARY (MAX) FILESTREAM NULL, 
    CONSTRAINT [PK_Responses] PRIMARY KEY CLUSTERED ([ResponseId] ASC) 
    FILESTREAM_ON [FileStreamGroup], UNIQUE NONCLUSTERED ([ResponseId] ASC) 
); 

ウェブconfifファイルは、プログラムが正しく動作し、小さなサイズのファイルのための適切なメッセージを示し、この

<system.web> 
    <authentication mode="None" /> 
    <compilation debug="true" targetFramework="4.5.1" /> 
    <httpRuntime targetFramework="4.5.1" maxRequestLength="3145728" 
    executionTimeout="9999999" useFullyQualifiedRedirectUrl="false" 
    minFreeThreads="8" minLocalRequestFreeThreads="4" 
    appRequestQueueLimit="1000"/> 
</system.web> 

<system.webServer> 

<security> 
    <requestFiltering> 
     <requestLimits maxAllowedContentLength="3221225472" /> 
    </requestFiltering> 
</security> 

のように設定されている、しかし、サイズ3メガバイトのファイルのためには、いずれも表示されません。エラーメッセージはメモリ不足でもありません。しかし、行とファイルは保存されます。なぜファイルをアップロードしてもメッセージが表示されないのですか?

+2

Visual Studio 15:VS2015(v14.x)またはVS2017(v15.x)を意味しますか? –

+0

私はあなたがクライアント側、サーバー側、およびSQL Serverロジックを持って参照してください。 3つのコンポーネントの最初の2つまたは後の2つの間に問題があるかどうかを確認するためにデバッグできましたか? –

+0

問題は、サーバーがクライアントにメッセージを送信していないことです。 –

答えて

0

ファイルストリームを直接操作している場合、この問題は次の方法で解決できます。

public int insertStreamResponse(HttpPostedFile file) 
    { 
     SqlConnection sqlConnection = new SqlConnection(); 
     sqlConnection.ConnectionString = "Data 
     Source=HOME\\MSQLEXPRESS2016;Initial Catalog=Evaluation;Integrated 
     Security=True"; 
     sqlConnection.Open(); 
     SqlCommand sqlCommand = new SqlCommand(); 
     sqlCommand.Connection = sqlConnection; 
     sqlCommand.CommandType = CommandType.Text; 
     sqlCommand.CommandText = "insert into responses values 
     (ResponseId, (0X))"; 
     SqlParameter parameter; 
     parameter = new System.Data.SqlClient.SqlParameter("@ResponseId", 
     System.Data.SqlDbType.UniqueIdentifier); 
     parameter.Value = this.response.ResponseId; 
     sqlCommand.Parameters.Add(parameter); 
     SqlCommand helperCommand = new SqlCommand(); 
     sqlCommand.Transaction = sqlConnection.BeginTransaction(); 
     sqlCommand.ExecuteNonQuery(); 
     helperCommand.Connection = sqlConnection; 
     helperCommand.Transaction = sqlCommand.Transaction; 
     helperCommand.CommandText = "SELECT 
     GET_FILESTREAM_TRANSACTION_CONTEXT()"; 
     Object transactionContext = helperCommand.ExecuteScalar(); 
     helperCommand.CommandText = "SELECT ResponseImage.PathName() FROM 
     Responses WHERE [ResponseId] = @Id"; 
     parameter = new System.Data.SqlClient.SqlParameter("@Id", 
     System.Data.SqlDbType.UniqueIdentifier); 
     helperCommand.Parameters.Add(parameter); 
     helperCommand.Parameters["@Id"].Value = sqlCommand.Parameters 
     ["@ResponseId"].Value; 
     string filePathInServer = (string)helperCommand.ExecuteScalar(); 
     byte[] buffer = new byte[file.ContentLength]; 
     //read from the input file 
     Stream fileStream = file.InputStream; 
     if (fileStream.CanRead) 
      fileStream.Read(buffer, 0, file.ContentLength); 
     else return 0; 
     //write into the file stream 
     SqlFileStream sqlFileStream = new SqlFileStream(filePathInServer, 
     (byte[])transactionContext, System.IO.FileAccess.Write); 
     if (sqlFileStream.CanWrite) 
      sqlFileStream.Write(buffer, 0, file.ContentLength); 
     else return 0; 
     sqlCommand.Transaction.Commit(); 
     sqlConnection.Close(); 
     return 1; 
    } 
+0

これは回答か質問の修正ですか? –

0

アプリケーションをホストするためにIISを使用している場合、デフォルトのアップロードファイルサイズは4MBです。

<system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLength="1073741824" /> </requestFiltering> </security> </system.webServer> 

注:maxAllowedContentLengthはバイト単位で測定されたIIS7の場合

<configuration> <system.web> <httpRuntime maxRequestLength="1048576" /> </system.web> </configuration> 

以上、あなたはまた、以下の行を追加する必要がある - それを増やすには、あなたのweb.configファイル内のセクションの下にこれを使用してくださいmaxRequestLengthはキロバイトで測定されます。そのため、この設定例では値が異なります。 (どちらも1 GBに相当します)

関連する問題