Загрузка и скачивание файлов — это технология, которую нам часто приходится использовать в процессе разработки проекта. Вот несколько распространенных методов. Основное содержание этой статьи включает в себя:
1. Как решить проблему ограничения размера загружаемого файла
2. Сохранить на сервер как файл.
3. Преобразование в двоичный поток байтов и сохранение в базе данных и метод загрузки.
4. Загрузка ресурсов в Интернет.
Часть 1:
Сначала давайте поговорим о том, как решить проблему ограничения размера загружаемого файла в ASP.NET. Мы знаем, что по умолчанию предел размера загружаемого файла в ASP.NET составляет 2 МБ. В общем, мы можем настроить его, изменив WEB. Файл конфигурации. Максимальный размер файла:
<httpRuntime ExecutionTimeout="300" maxRequestLength="40960" useFullyQualifiedRedirectUrl="false"/>Таким образом максимальное значение загружаемого файла становится 4М, но это не позволяет нам бесконечно расширять значение MaxRequestLength, поскольку ASP. NET будет После того, как все файлы загружены в память, они обрабатываются. Решение состоит в том, чтобы использовать неявный HttpWorkerRequest и использовать его методы GetPreloadedEntityBody и ReadEntityBody для чтения данных порциями из канала, созданного IIS для ASP.NET. Способ реализации следующий:
IServiceProviderprovider=(IServiceProvider)HttpContext.Current;
HttpWorkerRequestwr = (HttpWorkerRequest)provider.GetService (typeof (HttpWorkerRequest));
byte[]bs=wr.GetPreloadedEntityBody();
.
if(!wr.IsEntireEntityBodyIsPreloaded())
{
интервал = 1024;
байт[]bs2=новыйбайт[n];
while(wr.ReadEntityBody(bs2,n)>0)
{
..
}
}Это решит проблему загрузки больших файлов.
Часть 2:
Далее мы покажем, как загрузить файл с клиента на сервер в виде файла и вернуть некоторую базовую информацию о загруженном файле. Сначала мы определяем класс для хранения информации о загруженном файле (требуется при возврате). .
общедоступный класс FileUpLoad
{
публичный FileUpLoad()
{
}
/**//// <сводка>
/// Имя файла загрузки
/// </сводка>
общедоступная строка ИмяФайла
{
получать
{
вернуть имя файла;
}
набор
{
имя_файла = значение;
}
}
частная строка fileName;
/**//// <сводка>;
/// Путь к файлу загрузки
/// </сводка>
общедоступная строка FilePath
{
получать
{
вернуть путь к файлу;
}
набор
{
путь к файлу = значение;
}
}
путь к файлу частной строки;
/**//// <сводка>
/// Расширение файла
/// </сводка>
общедоступная строка FileExtension
{
получать
{
вернуть расширение файла;
}
набор
{
расширение файла = значение;
}
}
частная строка fileExtension;
}
Кроме того, мы также можем ограничить формат загружаемых файлов в файле конфигурации (App.Config):
<?xml version="1.0"coding="gb2312" ?>
<Приложение>
<Филеуплоад>
<Формат>.jpg|.gif|.png|.bmp</Формат>
</FileUpLoad>
</Приложение>
Таким образом, мы можем начать писать наш метод загрузки файлов следующим образом:
public FileUpLoad UpLoadFile (HtmlInputFile InputFile, строка filePath, строка myfileName, bool isRandom)
{
FileUpLoad fp = новая строка FileUpLoad (),
имя файла, расширение файла;
строка saveName;
//
//Создаем объект загрузки
//
HttpPostedFile PostedFile = InputFile.PostedFile;
имя_файла = System.IO.Path.GetFileName(postedFile.FileName);
fileExtension = System.IO.Path.GetExtension(fileName);
//
//Определяем формат файла на основе типа
//
Приложение AppConfig = новый AppConfig();
строковый формат = app.GetPath("FileUpLoad/Format");
//
//Если формат не совпадает, возвращаем
//
если(format.IndexOf(fileExtension)==-1)
{
throw new ApplicationException("Формат загруженных данных недопустим");
}
//
//Генерируем случайное имя файла на основе даты и случайного числа
//
if(myfileName!= string.Empty)
{
имя_файла = имя_мого_файла;
}
Если (isRandom)
{
Случайный objRand = новый Random();
System.DateTime date = DateTime.Now;
//Генерируем случайное имя файла
saveName = date.Year.ToString() + date.Month.ToString() + date.Day.ToString() + date.Hour.ToString() + date.Minute.ToString()
+ date.Second.ToString() + Convert.ToString(objRand.Next(99)*97 + 100);
имя_файла = имя_сохранения + расширение_файла;
}
строка phyPath = HttpContext.Current.Request.MapPath(filePath);
//Определяем, существует ли путь, если нет, создаем путь
DirectoryInfo upDir = новый DirectoryInfo (phyPath);
если(!upDir.Существует)
{
upDir.Создать();
}
//
//сохраняем файл
//
пытаться
{
PostFile.SaveAs(phyPath + имя_файла);
fp.FilePath = путь к файлу + имя_файла;
fp.FileExtension = FileExtension;
fp.ИмяФайла = ИмяФайла;
}
ловить
{
throw new ApplicationException("Загрузка не удалась!");
}
//Вернем информацию о загруженном файле
вернуть ФП;
}
Затем мы можем вызвать этот метод при загрузке файлов и сохранить возвращенную информацию о файле в базе данных. Что касается загрузки, просто откройте путь напрямую, и все будет в порядке.
Часть третья:
Здесь мы в основном говорим о том, как загружать и скачивать файлы в двоичном виде. Сначала поговорим о загрузке. Метод следующий:
общедоступный байт [] UpLoadFile (HtmlInputFile f_IFile)
{
//Получаем доступ к загруженному файлу, указанному клиентом
HttpPostedFile upFile = f_IFile.PostedFile;
//Получаем длину загруженного файла
int upFileLength=upFile.ContentLength;
//Получаем клиентский MIME-тип загруженного файла
строка contentType = upFile.ContentType;
байт [] FileArray = новый байт [upFileLength];
Поток fileStream = upFile.InputStream;
fileStream.Read(FileArray,0,upFileLength);
}Этот метод возвращает двоичный поток байтов загруженного файла, чтобы мы могли сохранить его в базе данных. Давайте поговорим об этой форме загрузки. Вы можете подумать, что загрузка таким способом заключается в создании новой aspx-страницы, затем извлечении потока двоичных байтов в событии Page_Load(), а затем его считывании. На самом деле это этот метод. не рекомендуется. В реальном приложении может возникнуть ошибка, из-за которой не удается открыть определенный сайт. Обычно я использую следующий метод:
Сначала добавьте: в Web.config:
<add verb="*" path="openfile.aspx" type="RuixinOA.Web.BaseClass.OpenFile, RuixinOA.Web"/>
Это означает, что когда я открываю страницу openfile.aspx, система автоматически выполнит методы класса RuixinOA.Web.BaseClass.OpenFile. Конкретная реализация выглядит следующим образом:
использование системы;
использование System.Data;
использование System.Web;
использование System.IO;
использование Ruixin.WorkFlowDB;
использованиеRXSuite.Base;
использованиеRXSuite.Компонент;
использование
пространства имен RuixinOA.BusinessFacade RuixinOA.Web.BaseClass
;
{
/**//// <сводка>
/// Краткое описание NetUFile.
/// </сводка>
общедоступный класс OpenFile: IHttpHandler
{
public void ProcessRequest (контекст HttpContext)
{
//Получаем информацию о файле для загрузки из базы данных
RuixinOA.BusinessFacade.RX_OA_FileManager os = новый RX_OA_FileManager();
Данные EntityData = os.GetFileDetail(id);
if(data!= null && data.Tables["RX_OA_File"].Rows.Count > 0)
{
DataRow dr = (DataRow)data.Tables["RX_OA_File"].Rows[0];
context.Response.Buffer = true;
контекст.Ответ.Очистить();
context.Response.ContentType = dr["CContentType"].ToString();
context.Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(dr["CTitle"].ToString()));
context.Response.BinaryWrite((Byte[])dr["CContent"]);
контекст.Ответ.Flush();
контекст.Ответ.Конец();
}
}
public bool IsReusable
{
получить {вернуть истину;}
}
}
}
После выполнения описанного выше метода система предложит пользователю выбрать непосредственное открытие или загрузку. Вот и все для этой части.
Часть 4.
В этой части в основном рассказывается о том, как загрузить ресурс из Интернета на сервер. У нас есть предыдущая статья, в которой подробно описано, как его использовать, поэтому я не буду говорить здесь больше.
См.: Преобразование динамических страниц в потоки двоичных байтов.
Часть 5. Краткое описание.
Сегодня я кратко расскажу о нескольких методах загрузки и скачивания файлов, которые часто используются при разработке реальных проектов. Надеюсь, каждый сможет поделиться своим опытом разработки проектов. Поправьте меня, если я плохо пишу, спасибо!
Электронная почта: [email protected]