3

我正在尝试在 mvc 项目中创建一个动作。可以将文件和图像上传到我的天蓝色存储。但由于某种原因,它不会正确上传,这就是我的猜测。如果我使用“Azure Storage Explorere”上传图像,它可以正常工作。示例:http ://storage.sogaard.us/company1/wallpaper-396234.jpg 但是如果我尝试上传图片,虽然我的操作不起作用,它会发送 200 表示成功和正确的内容类型,但图片不会加载,我的开发人员工具告诉我我没有从服务器获得数据。示例:http ://storage.sogaard.us/company1/b9206edac188e1d8aa2b3be7cdc4b94a.jpg

我试图将上传的 til 保存到我的本地计算机而不是 azure 存储中,并且在那里运行良好!我根本找不到原因,这一直困扰着我一整天:(

这是我的代码

[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();
    }
4

1 回答 1

1

在缩略图代码路径中,我认为您需要memStream.Position = 0在尝试上传之前将流重置回开头。

对于其他(非图像)代码路径,没有什么是错误的。该代码有效吗?

在这两个代码路径中,您都不需要blob.SetMetadata()and blob.SetProperties(),因为这些将在上传发生时完成。

[编辑]另外,有什么作用GetMimeFromFile?它是否从流中读取(因此可能将流位置留在开头以外的位置)?

于 2012-06-06T07:29:39.970 回答