2016-10-24 93 views
0

IIS 7.5でWebサイトを取得していて、別のドライブにあるFilesフォルダにファイルをアップロードしようとしています。 ファイルという仮想フォルダをwwwrootフォルダに追加しました。IEnvironment.WebRootPathとIISの仮想ディレクトリ

仮想ファイルのフォルダパスがDであること:\ファイル

コントローラでのアップロードのための私のコード:

_ENV変数はIHostingEnvironmentとコンストラクタに注入しているが。

var filename = _env.WebRootPath + [email protected]"\files\{model.JobID}.{model.FileExt}"; 
using (FileStream fs = System.IO.File.Create(filename)) 
{ 
    AttachFile.CopyTo(fs); 
    fs.Flush(); 
} 

マシンに物理フォルダwwwroot \ filesがあるため、ローカルで動作します。しかし、それはプロダクションサーバ上で動作しないと、次のエラーました:

An unhandled exception has occurred: Could not find a part of the path 'C:\inetpub\Mysite\wwwroot\files\111214.png'. 

をしかし、私はASPNET 4.6.1で別のウェブサイトを持っていると私はファイルをアップロードするServer.MapPathのを使用しました。そして、そのWebサイトで動作し、ファイルを正常にアップロードできます。

string SaveLocation = string.Format(@"{0}\{1}{2}", Server.MapPath("files"), JobID, FileExt); 

enter image description here

この記事によれば、Server.MapPathのとWebRootPathが類似していると言います。 http://www.mikesdotnetting.com/article/302/server-mappath-equivalent-in-asp-net-core

しかし、私にはWebRootPathがウェブサイトのRootPathを与えるだけであると思われます。 Server.MapPathのような指定されたURLを評価するためのパラメータは受け入れません。

.Net Coreアプリケーションの物理パスをハードコードするのではなく、プロダクションサーバーでファイルをアップロードするにはどうすればよいですか?

アップデート1:

これは私がこれまで達する最高です...私たちは、このように別の場所を指すように、別の仮想URLにアクセスしたり、作成することができます。 ASPNetCore StaticFiles

app.UseStaticFiles(new StaticFileOptions() 
    { 
     FileProvider = new PhysicalFileProvider(@"D:\Files"), 
     RequestPath = new PathString("/Files"),     
    }); 

しかし、それだけで読み取り専用のURLであると私は「/Files/newfile.jpg」またはPath.Combine(_envを使用して、このパスにアップロードすることはできません:それは、文献http://mysite/Files/abc.jpg

を経由してアクセスすることができ.WebRootPath、 "newfile.jpg")。物理的に存在しないためです。ここで

+0

WebRootPathはIIS vdirについて認識していません。この問題を解決する方法を見つけた場合は、IWebHostBuilder.UseWebRoot(mywebroot) – Tratcher

+0

で直接設定する必要があります。 – Ruchan

+0

@Ruchan IIS仮想フォルダの代わりに "D:\ mySharedfiles \"を使用して物理フォルダに直接書き込むことができます – TTCG

答えて

0

は、コンテンツやウェブルートを設定する方法です。

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var contentRoot = Directory.GetCurrentDirectory(); 

     var config = new ConfigurationBuilder() 
      .SetBasePath(contentRoot) 
      .AddJsonFile("hosting.json", optional: true) 
      .Build(); 

     //WebHostBuilder is required to build the server. We are configurion all of the properties on it 
     var hostBuilder = new WebHostBuilder() 

      .UseKestrel() 

      //Content root - in this example it will be our current directory 
      .UseContentRoot(contentRoot) 

      //Web root - by the default it's wwwroot but here is the place where you can change it 
      //.UseWebRoot("wwwroot") 

      //Startup 
      .UseStartup<Startup>() 

      .UseConfiguration(config); 

     var host = hostBuilder.Build(); 
     //Let's start listening for requests 
     host.Run(); 
    } 
} 

おそらくUseWebRoot()とUseContentRoot()は、あなたが探しているものです。

+0

どうすれば問題が解決するかを明確にしてください。私が知る限り、これはwwwrootフォルダ(WebRoot)とコンテンツルートフォルダを指すために使用されます。 WebRootまたはContentRootを使用してD:¥ファイル内のファイルをポイントするにはどうすればよいですか? ContentRootを使用してそのパスを指し示すと、私のすべてのビューが見つかりません。D:\ filesフォルダにビューがあります。 – TTCG

+0

ここをクリックしてください:https://docs.asp.net/en/latest/fundamentals/static-files.html。静的ファイルを扱う方法を説明した記事です。私の意見では、これらのすべての改善点(UseWebRoot()とUseContentRoot())を変更することは可能ですが、まだ問題を解決できない場合は、一歩前に戻って "D :\ files "となります。たぶんそれらをデータベースに保存する - SQL Serverはすばらしい "ファイルテーブル"機能をサポートしています。たぶんこのアプローチで試してみてください。 –

+0

はい、私はする必要があります。これらのファイルは他の2つのWebアプリケーションと共有されます。従来の.NetでServer.MapPath(xxx)を使用することで、同じ機能を簡単に実現できます。だから、.NETコアで同じことをする方法があると思った。明らかに、答えはNo :(。私はappSettings.jsonのパスをハードコードする必要があります。あなたの返信をありがとう。 – TTCG

関連する問題