Показать сообщение отдельно
Старый 09.08.2012, 12:28   #2  
AlexeyVS is offline
AlexeyVS
Участник
 
103 / 31 (2) +++
Регистрация: 02.04.2010
Итак, начинаем готовить.

1. Пишем "ядро" загрузчика. Я дописал еще один метод в класс EPDocuGet, взяв за основу один из существующих методов.

X++:
#define.BUFFER_SIZE(4096)

static void runDownloadFile(Filename fileName)
{
    IISResponse response = new IISResponse();
    BinData binData;
    int fileOffset;
    str headerFileName;
    ;

    headerFileName = System.IO.Path::GetFileName(fileName);
    headerFileName = strReplace(headerFileName, ';', '_');
    headerFileName = strReplace(headerFileName, ' ', '_');
    headerFileName = System.Web.HttpUtility::UrlEncode(headerFileName);

    response.clear();
    response.contentType('application/Octet-Stream');
    response.addHeader('Content-Disposition', 'attachment;filename="' + headerFileName + '"');

    binData = new BinData();
    fileOffset = 0;
    new FileIOPermission(fileName, 'r').assert();

    while (true)
    {
        // BP Deviation Documented
        if (!binData.loadFile(fileName, fileOffset, #BUFFER_SIZE))
        {
            break;
        }

        fileOffset += #BUFFER_SIZE;
        EPDocuGet::writeToResponse(response, binData.getData());
    }
}
Здесь fileName это полный путь к файлу на сервере.