2017-09-29 8 views
2

Visual Studio 15에서 작업하고 있습니다. 크기가 6MB 인 파일을 업로드해야합니다. .Net 4.5.1을 Entity Framework 6과 함께 사용하고 있습니다.Visual Studio에서 크기가 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라고하는 응답 테이블의 열 중 하나가 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 논리가 있습니다. 세 가지 구성 요소 중 처음 두 개 또는 후반 두 개 사이의 문제인지 확인하기 위해 디버그 할 수 있었습니까? –

+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> 

주 : Length 요청 헤더는 바이트 단위로 측정됩니다 IIS7를 들어

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

이상, 당신은 또한 아래의 라인을 추가 할 필요가 -를 높이기 위해, 당신의 Web.config의 섹션 아래에이를 이용하시기 바랍니다 반면 maxRequestLength는 킬로바이트 단위로 측정되므로이 구성 예에서는 값이 다릅니다. (둘 다 1GB와 같습니다.)