Maison  >  Article  >  interface Web  >  Partage de code de téléchargement de fichiers volumineux JS et WebService

Partage de code de téléchargement de fichiers volumineux JS et WebService

小云云
小云云original
2018-03-07 15:23:492379parcourir

Dans le processus d'écriture du front-end, il est inévitable de rencontrer le problème du téléchargement de fichiers. Lorsque les utilisateurs souhaitent télécharger des fichiers plus volumineux, ils seront restreints par le serveur et les empêcheront de télécharger. ajuster la capacité du serveur à accepter les fichiers. La méthode de configuration de la taille est la suivante :

Configurer le httpRuntime du fichier Web.config en ASP :

<httpRuntime executionTimeout="90" maxRequestLength="40960" useFullyQualifiedRedirectUrl="false"minFreeThreads="8" 
minLocalRequestFreeThreads="4" appRequestQueueLimit="100" enableVersionHeader="false"/>

Les fonctions de chacun. Les paramètres sont :

executionTimeout : Indique le délai maximum autorisé pour exécuter la requête, en secondes.
maxRequestLength : indique la taille maximale de téléchargement de fichier prise en charge par ASP.NET. Cette limite peut être utilisée pour empêcher les attaques par déni de service provoquées par les utilisateurs transmettant un grand nombre de fichiers au serveur. La taille spécifiée est en Ko. La valeur par défaut est 4 096 Ko (4 Mo).
useFullyQualifiedRedirectUr : Indique si la redirection client est entièrement qualifiée (au format "http://server/path", requis pour certains contrôles mobiles), ou s'il faut plutôt utiliser une redirection relative Envoyé au client. Si True, toutes les redirections qui ne sont pas entièrement qualifiées seront automatiquement converties au format pleinement qualifié. false est l'option par défaut.
minFreeThreads : Indique le nombre minimum de threads libres autorisés à exécuter de nouvelles requêtes. ASP.NET conserve un nombre spécifié de threads libres pour les requêtes qui nécessitent des threads supplémentaires pour terminer leur traitement. La valeur par défaut est 8.
minLocalRequestFreeThreads : indique le nombre minimum de threads libres maintenus par ASP.NET qui sont autorisés à exécuter de nouvelles requêtes locales. Ce nombre de threads est réservé aux requêtes entrantes de l'hôte local au cas où certaines requêtes adresseraient des sous-requêtes à l'hôte local lors de leur traitement. Cela évite d'éventuels blocages provoqués par une nouvelle saisie récursive sur le serveur Web.
appRequestQueueLimit : indique le nombre maximum de requêtes qu'ASP.NET mettra en file d'attente pour l'application. Les requêtes sont mises en file d'attente lorsqu'il n'y a pas suffisamment de threads libres pour traiter la requête. Lorsque la file d'attente dépasse la limite spécifiée dans ce paramètre, les demandes entrantes seront rejetées avec un message d'erreur « 503 - Serveur trop occupé ». EnableVersionHeader : indique si ASP.NET doit générer un en-tête de version. Microsoft Visual Studio 2005 utilise cette propriété pour déterminer la version d'ASP.NET actuellement utilisée. Pour les environnements de production, cette propriété n'est pas obligatoire et peut être désactivée.

Cependant, même si la taille du fichier téléchargé dans la configuration du serveur est suffisamment grande, il sera limité par IIS et ne pourra pas fournir de services sécurisés aux utilisateurs. Alors, existe-t-il un moyen de résoudre le problème du téléchargement de fichiers volumineux ?
Il y en a certainement un : le téléchargement en plusieurs parties.
Le téléchargement multiple consiste à couper le fichier que vous souhaitez télécharger en très petits morceaux sur le front-end, puis à le transmettre au serveur, puis à combiner le fichier en un fichier complet à partir du serveur.
Commençons par le front-end. Pendant le processus de téléchargement en plusieurs parties, la tâche frontale consiste à fragmenter le fichier. Il existe de nombreuses façons de fragmenter. Par exemple, vous pouvez utiliser le composant de téléchargement fourni par WebUpLoader. fragment, ou vous pouvez utiliser JS et JQ. Téléchargez le code fourni. L'exemple de code est le suivant :

var BYTES_PER_CHUNK = 1024 * 1024; // 每个文件切片大小定为1MB .
var slices;
var totalSlices;

//发送请求
function sendRequest() {
var blob = document.getElementById("yourID").files[0];
var start = 0;
var end;
var index = 0;


// 计算文件切片总数
slices = Math.ceil(blob.size / BYTES_PER_CHUNK);
totalSlices= slices;
while(start < blob.size) {
end = start + BYTES_PER_CHUNK;
if(end > blob.size) {
end = blob.size;
}
uploadFile(blob, index, start, end);
start = end;
index++;
if ( index>=totalSlices )
alert("Complete!!");
}
}

//上传文件
function uploadFile(blob, index, start, end) {
var xhr;
var fd;
var chunk;  
var sliceIndex=blob.name+index;
chunk =blob.slice(start,end);//切割文件

fd = new FormData();
fd.append("FileName", chunk, sliceIndex);
var xhr = new XMLHttpRequest();
xhr.open(&#39;POST&#39;, &#39;Server URL&#39;, false);//false,同步上传;ture,异步上传
xhr.send(fd);
if((xhr.status >=200 && xhr.status < 300) || xhr.status == 304){
setTimeout("",10);
}else{
uploadFile(blob, index, start, end);
}
}

Avec le front-end, bien sûr, l'acceptation et la combinaison au back-end sont indispensables. Ici, j'utilise ASP.Net comme exemple pour expliquer comment recevoir et combiner des fichiers.

public void RecoveryKPJD()
        {
            HttpContext context = System.Web.HttpContext.Current;
            context.Response.ContentType = "text/plain";
            //如果进行了分片
            if (context.Request.Form.AllKeys.Any(m => m == "chunk"))
            {
                //取得chunk和chunks
                int chunk = Convert.ToInt32(context.Request.Form["chunk"]);//当前分片在上传分片中的顺序(从0开始)
                int chunks = Convert.ToInt32(context.Request.Form["chunks"]);//总分片数
                //根据GUID创建用该GUID命名的临时文件夹
                string folder = Your Path + context.Request["guid"] + "/";
                string path = folder + chunk;


                //建立临时传输文件夹
                if (!Directory.Exists(Path.GetDirectoryName(folder)))
                {
                    Directory.CreateDirectory(folder);
                }

                FileStream addFile = new FileStream(path, FileMode.Append, FileAccess.Write);
                BinaryWriter AddWriter = new BinaryWriter(addFile);
                //获得上传的分片数据流
                HttpPostedFile file = context.Request.Files[0];
                Stream stream = file.InputStream;

                BinaryReader TempReader = new BinaryReader(stream);
                //将上传的分片追加到临时文件末尾
                AddWriter.Write(TempReader.ReadBytes((int)stream.Length));
                //关闭BinaryReader文件阅读器
                TempReader.Close();
                stream.Close();
                AddWriter.Close();
                addFile.Close();

                TempReader.Dispose();
                stream.Dispose();
                AddWriter.Dispose();
                addFile.Dispose();
                if (chunk == chunks - 1)
                {
                    //合并文件
                    ProcessRequest(context.Request["guid"], Path.GetExtension(file.FileName));
                }
            }
            else//没有分片直接保存
            {
                string targetPath = ""; //此处写文件的保存路径
                context.Request.Files[0].SaveAs(targetPath);
            }
        }

   private void ProcessRequest(string guid, string fileExt)
        {
            HttpContext context = System.Web.HttpContext.Current;
            context.Response.ContentType = "text/plain";
            string sourcePath = Path.Combine("Your Path", guid + "/");//源数据文件夹
            string targetPath = Path.Combine("Your Path", Guid.NewGuid() + fileExt);//合并后的文件

            DirectoryInfo dicInfo = new DirectoryInfo(sourcePath);
            if (Directory.Exists(Path.GetDirectoryName(sourcePath)))
            {
                FileInfo[] files = dicInfo.GetFiles();
                foreach (FileInfo file in files.OrderBy(f => int.Parse(f.Name)))
                {
                    FileStream addFile = new FileStream(targetPath, FileMode.AppenFileAccess.Write);
                    BinaryWriter AddWriter = new BinaryWriter(addFile);

                    //获得上传的分片数据流
                    Stream stream = file.Open(FileMode.Open);
                    BinaryReader TempReader = new BinaryReader(stream);
                    //将上传的分片追加到临时文件末尾
                    AddWriter.Write(TempReader.ReadBytes((int)stream.Length));
                    //关闭BinaryReader文件阅读器
                    TempReader.Close();
                    stream.Close();
                    AddWriter.Close();
                    addFile.Close();

                    TempReader.Dispose();
                    stream.Dispose();
                    AddWriter.Dispose();
                    addFile.Dispose();
                }
            }
        }

Recommandations associées :

Détection de la taille des fichiers PHP et traitement du téléchargement de fichiers volumineux

Explication détaillée de l'appel de Nodejs WebService

Un exemple simple d'appel inter-domaines js WebService

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn