Мы решили эту проблему (частично), запустив файлы непосредственно в выходной поток, используя потоки blob. Это позволяет избежать проблемы с загрузкой zipping, а затем отправлять и избегать задержки, когда это происходит (мы использовали ICSharpZipLib, reference ). Но это все равно означает маршрутизацию потока через веб-сервер:
public void ZipFilesToResponse(HttpResponseBase response, IEnumerable files, string zipFileName)
{
using (var zipOutputStream = new ZipOutputStream(response.OutputStream))
{
zipOutputStream.SetLevel(0); // 0 - store only to 9 - means best compression
response.BufferOutput = false;
response.AddHeader("Content-Disposition", "attachment; filename=" + zipFileName);
response.ContentType = "application/octet-stream";
foreach (var file in files)
{
var entry = new ZipEntry(file.FilenameSlug())
{
DateTime = DateTime.Now,
Size = file.Filesize
};
zipOutputStream.PutNextEntry(entry);
storageService.ReadToStream(file, zipOutputStream);
response.Flush();
if (!response.IsClientConnected)
{
break;
}
}
zipOutputStream.Finish();
zipOutputStream.Close();
}
response.End();
}
Служба хранения просто делает это:
public void ReadToStream(IFileIdentifier file, Stream stream, StorageType storageType = StorageType.Stored, ITenant overrideTenant = null)
{
var reference = GetBlobReference(file, storageType, overrideTenant);
reference.DownloadToStream(stream);
}
private CloudBlockBlob GetBlobReference(IFileIdentifier file, StorageType storageType = StorageType.Stored, ITenant overrideTenant = null)
{
var filepath = GetFilePath(file, storageType);
var container = GetTenantContainer(overrideTenant);
return container.GetBlockBlobReference(filepath);
}
вы можете получить ожидаемый результат с помощью
hash_data = orders.map do |el|
[{ y: el[compare], label: "rain_fall_type1" }, { y: el[rain_fall_type], label: "Land_Area" }]
end
hash_data.flatten
, и если вы хотите, чтобы они находились в паре из двух
hash_data.flatten.each_slice(2).to_a
hash_data = b.map do |el|
{ y: el[compare], label: "rain_fall_type1" }
{ y: el[rain_fall_type], label: compare }
end
Этот блок карты не приводит к двум хэшам. Он содержит два разных утверждения. Первый создает хэш и отбрасывает его. Второй создает хэш, который возвращается из блока карты, так как это последнее выражение. Первый оператор ничего не делает.
Если вы хотите вернуть несколько хэшей из блока карты или что-то еще, вы должны обернуть их другим объектом, например массивом.
hash_data = b.map do |el|
[
{ y: el[compare], label: "rain_fall_type1" },
{ y: el[rain_fall_type], label: compare }
]
end