2017-09-29 3 views
2

Je travaille sur Visual Studio 15. Mon application doit télécharger un fichier de taille 6MB. J'utilise .Net 4.5.1 avec Entity Framework 6.Visual studio ne répond pas à télécharger un fichier de taille 6MB

Le script et le code html suivants sont écrits au niveau de vue rasoir pour sélectionner et vérifier le téléchargement du fichier.

$('#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> 

Le code suivant est écrit dans le contrôleur pour obtenir le téléchargement du fichier et afficher le message approprié. La fonction suivante est utilisée pour insérer une ligne dans une table de base de données SQL appelée Réponses.

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; 
    } 
    } 

L'une des colonnes de la table de réponses appelée responseImage est le type de données de fileStream. Une autre colonne est de type uniqueIdentifier. La création de table sql est donnée ci-dessous.

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) 
); 

Le fichier confif Web est défini comme celui-ci

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

Le programme fonctionne correctement et affiche le message approprié pour les fichiers de petite taille, mais pour les fichiers de taille 3 Mo, il ne montre pas message d'erreur même pas de mémoire. Mais la ligne et le fichier sont sauvegardés. Pourquoi ne montre-t-il aucun message alors qu'il télécharge le fichier?

+2

Visual Studio 15: Voulez-vous dire VS2015 (v14.x) ou VS2017 (v15.x)? –

+0

Je vois que vous avez le côté client, le côté serveur et la logique SQL Server. Avez-vous été en mesure de déboguer pour vérifier si le problème entre les deux premiers ou les deux derniers des trois composants? –

+0

Le problème est que le serveur n'envoie pas de message au client –

Répondre

0

Si nous manipulons le flux de fichier directement le problème peut être résolu de la manière suivante.

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

Est-ce que ceci est une réponse ou un amendement à votre question? –

0

Si vous utilisez IIS pour l'hébergement de votre application, la taille du fichier de téléchargement par défaut si 4Mo. Pour l'augmenter, s'il vous plaît utiliser cette section ci-dessous dans votre web.config -

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

Pour IIS7 et au-dessus, vous devez également ajouter les lignes ci-dessous:

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

Note: maxAllowedContentLength est mesurée en octets tandis que maxRequestLength est mesuré en kilooctets, ce qui explique pourquoi les valeurs diffèrent dans cet exemple de configuration. (Les deux sont équivalents à 1 Go.)