Azure storage: загруженные файлы размером 0 байт
Когда я загружаю файл изображения в blob, изображение загружается, видимо, успешно (без ошибок). Когда я иду в облачную студию хранения, файл есть, но с размером 0 (нулевых) байтов.
Ниже приведен код, который я использую:
// These two methods belong to the ContentService class used to upload
// files in the storage.
public void SetContent(HttpPostedFileBase file, string filename, bool overwrite)
{
CloudBlobContainer blobContainer = GetContainer();
var blob = blobContainer.GetBlobReference(filename);
if (file != null)
{
blob.Properties.ContentType = file.ContentType;
blob.UploadFromStream(file.InputStream);
}
else
{
blob.Properties.ContentType = "application/octet-stream";
blob.UploadByteArray(new byte[1]);
}
}
public string UploadFile(HttpPostedFileBase file, string uploadPath)
{
if (file.ContentLength == 0)
{
return null;
}
string filename;
int indexBar = file.FileName.LastIndexOf('\\');
if (indexBar > -1)
{
filename = DateTime.UtcNow.Ticks + file.FileName.Substring(indexBar + 1);
}
else
{
filename = DateTime.UtcNow.Ticks + file.FileName;
}
ContentService.Instance.SetContent(file, Helper.CombinePath(uploadPath, filename), true);
return filename;
}
// The above code is called by this code.
HttpPostedFileBase newFile = Request.Files["newFile"] as HttpPostedFileBase;
ContentService service = new ContentService();
blog.Image = service.UploadFile(newFile, string.Format("{0}{1}", Constants.Paths.BlogImages, blog.RowKey));
Перед тем, как файл изображения будет загружен в хранилище, свойство InputStream из HttpPostedFileBase выглядит отлично (размер изображения соответствует ожидаемому! И никаких исключений не выбрасывается).
И действительно странно, что это отлично работает в других случаях (загрузка Power Points или даже других изображений из роли "Рабочий" ). Код, который вызывает метод SetContent, выглядит точно таким же, и файл кажется правильным, так как новый файл с нулевыми байтами создается в правильном месте.
Есть ли у кого-нибудь какие-либо предложения? Я отлаживал этот код десятки раз, и я не вижу проблемы. Любые предложения приветствуются!
Спасибо
Ответы
Ответ 1
Свойство Position для InputStream объекта HttpPostedFileBase имеет то же значение, что и свойство Length (возможно, потому, что у меня был другой файл, предшествующий этому, - глупо, я думаю!).
Все, что мне нужно было сделать, - вернуть свойство Position в 0 (ноль)!
Я надеюсь, что это поможет кому-то в будущем.
Ответ 2
Спасибо Фабио за то, что он поднял это и решил свой собственный вопрос. Я просто хочу добавить код к тому, что вы сказали. Ваше предложение отлично сработало для меня.
var memoryStream = new MemoryStream();
// "upload" is the object returned by fine uploader
upload.InputStream.CopyTo(memoryStream);
memoryStream.ToArray();
// After copying the contents to stream, initialize it position
// back to zeroth location
memoryStream.Seek(0, SeekOrigin.Begin);
И теперь вы готовы загрузить memoryStream, используя:
blockBlob.UploadFromStream(memoryStream);