3

mvcプロジェクトでアクションを作成しようとしています。ファイルや画像をAzureストレージにアップロードできます。しかし、どういうわけか、それは正しくアップロードされないのでしょうか、それは私が推測していることです。「AzureStorageExplorere」を使用して画像をアップロードすると、正常に機能します。例:http : //storage.sogaard.us/company1/wallpaper-396234.jpgただし、アクションが機能しないにもかかわらず画像をアップロードしようとすると、成功のために200が送信され、正しいコンテンツタイプが送信されますが、画像はが読み込まれず、開発者ツールから、サーバーからデータを取得できなかったことが通知されます。例:http ://storage.sogaard.us/company1/b9206edac188e1d8aa2b3be7cdc4b94a.jpg

アップロードしたティルを紺碧のストレージではなくローカルコンピューターに保存しようとしましたが、そこでは正常に機能しました。私は単に理由を見つけることができず、これは一日中私を悩ませてきました:(

これが私のコードです

[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()ありません。blob.SetProperties()

[編集]また、何をしGetMimeFromFileますか?ストリームから読み取りますか(したがって、ストリームの位置を最初以外の場所に残す可能性があります)?

于 2012-06-06T07:29:39.970 に答える