Androme
Androme

Reputation: 2449

Azure storage, can not upload images correctly

I am trying to create a action, in a mvc project. that can upload files and images to my azure storage. but for some reason will it just not upload corrently, that is what i am guessing. If i upload the image with "Azure Storage Explorere" dose it work fine. Example: http://storage.sogaard.us/company1/wallpaper-396234.jpg But if i try to upload the image though my action will it not work, it send a 200 for succes and the right conten type, but the image will not load, and my developer tool tells me i got not data from the server. Example: http://storage.sogaard.us/company1/b9206edac188e1d8aa2b3be7cdc4b94a.jpg

I have tried to save the uploaded til to my local computer instead of the azure storage and it worked fine there! I can simply not find the reason and this have been bugging me all day :(

Here is my code

[HttpPost]
public ActionResult Upload(FilesUploadModel model, IEnumerable<HttpPostedFileBase> files)
{

    if(ModelState.IsValid)
    {
        if (files != null && files.Any())
        {
            int maxSizeInBytes = ConfigurationManager.Instance.Configuration.FileMaxSize;
            Size thumbSize = new Size(200, 200);

            foreach (HttpPostedFileBase file in files.Where(x => x != null))
            {
                CMS.Common.Data.File _file = new Sogaard.Inc.CMS.Common.Data.File();

                // is any files uploadet?
                if (!(file.ContentLength > 0))
                {
                    FlashHelper.Add(Text("File not received"), FlashType.Error);
                    continue;
                }
                // is the file larger then allowed
                if (file.ContentLength > maxSizeInBytes)
                {
                    FlashHelper.Add(Text("The file {0}'s file size was larger then allowed", file.FileName), FlashType.Error);
                    continue;
                }

                var fileName = Encrypting.MD5(Path.GetFileNameWithoutExtension(file.FileName) + DateTime.Now) + Path.GetExtension(file.FileName);
                string mimeType = FileHelper.MimeType(FileHelper.GetMimeFromFile(file.InputStream));

                _file.SiteId = SiteId();
                _file.Container = GetContainerName();
                _file.FileName = Path.GetFileName(file.FileName);
                _file.FileNameServer = fileName;
                _file.Created = DateTime.Now;
                _file.Folder = model.Folder;
                _file.Size = file.ContentLength;
                _file.Type = mimeType;

                if (mimeType.ToLower().StartsWith("image/"))
                {
                    try
                    {
                        // So we don't lock the file
                        using (Bitmap bitmap = new Bitmap(file.InputStream))
                        {
                            _file.Information = bitmap.Width + "|" + bitmap.Height;

                            if (bitmap.Height > 500 && bitmap.Width > 500)
                            {
                                var thumbfileName = Encrypting.MD5(Path.GetFileNameWithoutExtension(file.FileName) + "thumb" + DateTime.Now) + ".jpeg";
                                Size thumbSizeNew = BaseHelper.ResizeImage(bitmap.Size, thumbSize);
                                Bitmap thumbnail = (Bitmap)bitmap.GetThumbnailImage(thumbSizeNew.Width,
                                                                                          thumbSizeNew.Height,
                                                                                          ThumbnailCallback,
                                                                                          IntPtr.Zero);
                                _file.ThumbFileNameServer = thumbfileName;
                                // Retrieve reference to a blob named "myblob"
                                CloudBlob blob = container().GetBlobReference(_file.ThumbFileNameServer);
                                blob.Metadata["Filename"] = Path.GetFileNameWithoutExtension(file.FileName) + "-thumb" + ".jpg";
                                blob.Properties.ContentType = "image/jpeg";

                                // Create or overwrite the "myblob" blob with contents from a local file
                                using (MemoryStream memStream = new MemoryStream())
                                {
                                    thumbnail.Save(memStream, ImageFormat.Jpeg);
                                    blob.UploadFromStream(memStream);
                                }
                                blob.SetMetadata();
                                blob.SetProperties();
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        if (e.GetType() != typeof (DataException))
                            FlashHelper.Add(Text("The image {0} was not a valid image", file.FileName),
                                            FlashType.Error);
                        // Removing the file
                        System.IO.File.Delete(file.FileName);
                    }
                }
                else
                {
                    _file.Information = null;
                }
                // Retrieve reference to a blob named "myblob"
                CloudBlob blobF = container().GetBlobReference(fileName);
                blobF.Metadata["Filename"] = file.FileName;
                blobF.Properties.ContentType = mimeType;

                // Create or overwrite the "myblob" blob with contents from a local file
                blobF.UploadFromStream(file.InputStream);
                blobF.SetMetadata();
                blobF.SetProperties();

                fileService.Save(_file);
            }
        }

        return RedirectToAction("Display", new { Folder = model.Folder });
    }

    model.FolderSugestion = fileService.GetFolders(SiteId());
    return View(model);
}

    private CloudBlobContainer container()
    {
        // Retrieve storage account from connection-string
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
            RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));

        // Create the blob client
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        // Retrieve reference to a previously created container
        var container = blobClient.GetContainerReference(GetContainerName());
        container.CreateIfNotExist();
        return container;
    }

    private string GetContainerName()
    {
        return "company" + SiteId();
    }

Upvotes: 3

Views: 1950

Answers (1)

user94559
user94559

Reputation: 60143

In the thumbnail code path, I think you need memStream.Position = 0 to reset the stream back to the beginning before trying to upload it.

For the other (non-image) code path, nothing stands out as wrong. Does that code work?

In both code paths, you don't need blob.SetMetadata() and blob.SetProperties(), since those will be done when the upload happens.

[EDIT] Also, what does GetMimeFromFile do? Does it read from the stream (thus perhaps leaving the stream position somewhere other than the beginning)?

Upvotes: 1

Related Questions