Azure存储:上载的文件大小为零字节

file-upload azure azure-storage-blobs

5696 观看

3回复

4181 作者的声誉

当我将图像文件上传到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));

在将图像文件上载到存储之前,来自HttpPostedFileBase的Property InputStream看起来很好(图像的大小对应于预期的内容!并且不会抛出异常)。

真正奇怪的是,这在其他情况下非常有效(从Power角色上传Power Points甚至其他图像)。调用SetContent方法的代码似乎完全相同,文件似乎是正确的,因为在正确的位置创建了一个零字节的新文件。

有人有什么建议吗?我调试了这个代码几十次,我看不出问题。欢迎任何建议!

谢谢

作者: Fabio Milheiro 的来源 发布者: 2010 年 5 月 25 日

回应 (3)


48

4181 作者的声誉

决定

HttpPostedFileBase的InputStream的Position属性与Length属性具有相同的值(可能是因为我之前有另一个文件 - 我觉得这很愚蠢!)。

我所要做的就是将Position属性设置回0(零)!

我希望这有助于将来的某些人。

作者: Fabio Milheiro 发布者: 26.05.2010 10:40

22

657 作者的声誉

感谢Fabio提出并解决您自己的问题。我只是想为你所说的内容添加代码。你的建议对我很有用。

        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);
作者: Blaze 发布者: 05.08.2016 07:26

0

16 作者的声誉

很好,它有帮助...谢谢。

作者: ThermeshB 发布者: 27.02.2019 06:58
32x32