加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-4 – 用于上传mime文件和表单数据的MultipartFormDa

发布时间:2020-12-16 09:37:40 所属栏目:asp.Net 来源:网络整理
导读:由于Azure要求,使用RTM版本,Framework 4 代码在Azure模拟器上运行时出错 – 我怀疑问题与路径/环境变量有关. Azure Web角色失败,出现404错误 这是控制器代码: [ValidateInput(false)] public HttpResponseMessage Post() { try { if (!Request.Content.IsMi
由于Azure要求,使用RTM版本,Framework 4
代码在Azure模拟器上运行时出错 – 我怀疑问题与路径/环境变量有关.
Azure Web角色失败,出现404错误

这是控制器代码:

[ValidateInput(false)]
  public HttpResponseMessage Post()
  {
      try
      {
          if (!Request.Content.IsMimeMultipartContent("form-data"))
          {
              throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
          }
          string tempPath = RoleEnvironment.GetLocalResource("tempStorage").RootPath;
          Environment.SetEnvironmentVariable("TEMP",tempPath);
          Environment.SetEnvironmentVariable("TMP",tempPath);

          string Host = "test";
          string StorageConnection = "credentials here";
          string Product = "Product";
          string CompanyID = "Company";
          DocStorage docStorage = new DocStorage(Host,Product,CompanyID,StorageConnection);
          var multipartStreamProvider = new AzureBlobStorageMultipartProvider(docStorage.BlobContainer,tempPath);
          Stream reqStream = Request.Content.ReadAsStreamAsync().Result;
          if (reqStream.CanSeek)
          {
              reqStream.Position = 0;
          }

          Request.Content.ReadAsMultipartAsync<AzureBlobStorageMultipartProvider>(multipartStreamProvider).ContinueWith<List<FileDetails>>(t =>
          {
              if (t.IsFaulted)
              {
                  throw t.Exception;
              }
              AzureBlobStorageMultipartProvider provider = t.Result;

              foreach (var fileData in provider.FileData)
              {
                  string fileName = Path.GetFileName(fileData.Headers.ContentDisposition.FileName.Trim('"'));
                  string fileNameBlob = Path.GetFileName(fileData.LocalFileName.Trim('"'));
                  CloudBlob blob = docStorage.BlobContainer.GetBlobReference(fileNameBlob);

                     if (!string.IsNullOrEmpty(provider.FormData["company"])) 
                        blob.Metadata[AriettDocStorage.FileNameFileLocation] = provider.FormData["company"];
                  blob.SetMetadata();
              }
              return provider.Files;
          });
          return new HttpResponseMessage(HttpStatusCode.OK);
      }
      catch
      {
          return new HttpResponseMessage(HttpStatusCode.NotFound);
      }
  }

这是覆盖

public class AzureBlobStorageMultipartProvider : MultipartFormDataStreamProvider
{
    public CloudBlobContainer Container;
    public AzureBlobStorageMultipartProvider(CloudBlobContainer container,string tempPath)
        : base(tempPath)
    {
        Container = container;
    }
    public override Task ExecutePostProcessingAsync()
    {
        // Upload the files to azure blob storage and remove them from local disk 
        foreach (var fileData in this.FileData)
        {
            string fileName = Path.GetFileName(fileData.Headers.ContentDisposition.FileName.Trim('"'));

            // Retrieve reference to a blob 
            string fileNameBlob = Path.GetFileName(fileData.LocalFileName.Trim('"'));

            CloudBlob blob = Container.GetBlobReference(fileNameBlob);
            blob.Properties.ContentType = fileData.Headers.ContentType.MediaType;
            blob.UploadFile(fileData.LocalFileName);
            blob.SetProperties();
            File.Delete(fileData.LocalFileName);
            Files.Add(new FileDetails
            {
                ContentType = blob.Properties.ContentType,Name = blob.Name,Size = blob.Properties.Length,Location = blob.Uri.AbsoluteUri
            });
        }

        return base.ExecutePostProcessingAsync();
    }

解决方法

我解决了这个问题,这是一些小事,与路径无关,这是正确完成的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读