Хранилище Azure: загруженные файлы с нулевым размером байтов - PullRequest
24 голосов
/ 25 мая 2010

Когда я загружаю файл изображения в блоб, изображение загружается, по-видимому, успешно (без ошибок). Когда я иду в студию облачного хранилища, файл там, но с размером 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 Point или даже других изображений из роли Worker). Код, который вызывает метод SetContent, кажется, точно такой же, и файл кажется правильным, поскольку новый файл с нулевыми байтами создается в правильном месте.

Есть ли у кого-нибудь предложения, пожалуйста? Я отлаживал этот код десятки раз и не вижу проблемы. Любые предложения приветствуются!

Спасибо

Ответы [ 2 ]

49 голосов
/ 26 мая 2010

Свойство Position для InputStream объекта HttpPostedFileBase имело то же значение, что и свойство Length (возможно, потому что у меня был другой файл, предшествующий этому - я думаю, глупо!).

Все, что мне нужно было сделать, это установить для свойства Position значение 0 (ноль)!

Я надеюсь, что это поможет кому-то в будущем.

22 голосов
/ 05 августа 2016

Спасибо Фабио за то, что подняли этот вопрос и решили свой вопрос. Я просто хочу добавить код к тому, что вы сказали. Ваше предложение отлично сработало для меня.

        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's position
// back to zeroth location

        memoryStream.Seek(0, SeekOrigin.Begin);

И теперь вы готовы загрузить memoryStream, используя:

blockBlob.UploadFromStream(memoryStream);
...