# Problem
要如何利用MVC架構將檔案從FTP下載或是讀取出來丟到View?
目前因為要用three.js去呈現3D環境,而顯示模型是透過讀取相對路徑或是input type=“file”內的檔案轉換成URL進行Loaded。
**設想架構:**

以下是我的程式:
## 3D Viewer Environment
### javascript
(base on three.js)
```javascript=
const input = document.getElementById("fileurl");
const modelURL = URL.createObjectURL(input.value);
ifcLoader.load(modelURL, (ifcModel) => {
scene.add(ifcModel);
});
```
## MVC架構
### cshtml
```javascript=
<form method="get" action="/Object/threeD">
<div class="u-form-group u-form-select u-label-top u-form-group-1">
<button name="ObjectName" value="@obj.ObjectName" class="btn btn-light">3D Viewer</button>
<input type="hidden" name="ReleaseDate" value="@obj.ReleaseDate">
<input type="hidden" name="Location" value="@obj.Location">
<input type="hidden" name="Author" value="@obj.Author">
</div>
</form>
<input type="file"name="fileurl" value="" id="fileurl"/>
```
### Controller
```javascript=
[HttpGet]
public ActionResult threeD(Objectmodel objectmodel, CommentModel comment)
{
Object_f obj = new Object_f();
//建立FTP連接
string FTPfilePath = Server.MapPath("~/App_Start/Json/FTPconfig.json");
StreamReader reader = new StreamReader(FTPfilePath);
string jsonFTP = reader.ReadToEnd();
var dataFTP = (JObject)JsonConvert.DeserializeObject(jsonFTP);
string ftp = dataFTP["ftpserver"].Value<string>();
string ftpUserName = dataFTP["ftpuser"].Value<string>();
string ftpPassword = dataFTP["ftppass"].Value<string>();
string ftpMainFolder = dataFTP["ftpMainFolder"].Value<string>();
string Foldername = objectmodel.ReleaseDate.Replace("/", "").Replace(":", "").Replace("_", "") + "_" + objectmodel.ObjectName + "_" + objectmodel.Location;
List<Files> ftp_objs = obj.CreateZipFile(ftp, ftpUserName, ftpPassword, ftpMainFolder, Foldername);
if (ftp_objs.Count >= 1)
{
foreach(Files file in ftp_objs)
{
string filename = Path.GetFileName(file.FileName);
List<string> filename_ = filename.Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (!filename_.Last( ).ToLower().Equals("ifc"))
{
TempData["error"] = "Your model upload wrong file type, Please change to File type(.ifc)";
return RedirectToAction("ObjectDetail", "Object");
}
else
{
//File Download or reader:
// How to do??
//---------------------
return RedirectToAction("ObjectDetail", "Object");
}
}
}
return RedirectToAction("ObjectDetail", "Object");
}
```
存放模型檔案夾路徑:\ftp\Model\ {ReleaseDate}_ {ObjectName}_ {Location}

{ReleaseDate}_ {ObjectName}_ {Location}裡面的資料結構:

### Model
```javascript=
public List<string> CreateFTPList(string ftp, string ftpUserName, string ftpPassword, string ftpMainFolder, string Foldername) {
// Get the object used to communicate with the server.
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftp + ftpMainFolder + Foldername);
request.Method = WebRequestMethods.Ftp.ListDirectory;
// This example assumes the FTP site uses anonymous logon.
request.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
string names = reader.ReadToEnd();
reader.Close();
response.Close();
List<string> source = names.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToList();
return source;
}
public List<Files> CreateZipFile(string ftp,string ftpUserName,string ftpPassword ,string ftpMainFolder,string Foldername)
{
List<Files> fileList = new List<Files>();
foreach (string file in CreateFTPList(ftp, ftpUserName, ftpPassword, ftpMainFolder, Foldername))
{
if (file.Equals("Specification"))
{
string ftpFolder_t = ftpMainFolder + Foldername + "/";
string Foldername_t = "Specification";
foreach (string file_t in CreateFTPList(ftp, ftpUserName, ftpPassword, ftpFolder_t, Foldername_t))
{
WebClient request_T = new WebClient();
string url = ftp + ftpFolder_t + Foldername_t + "/" +file_t;
request_T.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
byte[] bytes = request_T.DownloadData(url);
fileList.Add(new Files() { FileName = file_t, Bytes = bytes, gvFiles = url });
}
}
else
{
WebClient request = new WebClient();
string url_ = ftp + ftpMainFolder + Foldername + "/" + file;
request.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
byte[] bytes_ = request.DownloadData(url_);
fileList.Add(new Files() { FileName = file, Bytes = bytes_, gvFiles = url_});
}
}
return fileList;
}
```