2011-09-04 50 views
5

Tôi mới đến mvc và tôi đang mắc kẹt với một vấn đề. Tôi đã tìm kiếm tất cả các câu trả lời và tôi không thể tìm thấy câu trả lời, nhưng tôi chắc chắn rằng có thứ gì đó đã bỏ qua tôi. Vấn đề là tôi không biết làm thế nào để acces một tập tin sau khi tôi tải nó lên thư mục App_Data. Tôi sử dụng mã tương tự mà tôi tìm thấy trên tất cả các diễn đàn:Cách xem tệp sau khi tải tệp lên App_Data/Tải lên trong MVC 3 bằng Razor?

Đối với quan điểm của tôi tôi sử dụng này

@using (Html.BeginForm("Index", "Home", FormMethod.Post, 
new { enctype="multipart/form-data" })) 
{ 
<input type="file" name="file" /> 
<input type="submit" value="submit" /> 
} 

Đối với bộ điều khiển của tôi, tôi sử dụng

public class HomeController : Controller 
{ 
// This action renders the form 
public ActionResult Index() 
{ 
    return View(); 
} 

// This action handles the form POST and the upload 
[HttpPost] 
public ActionResult Index(HttpPostedFileBase file) 
{ 
    // Verify that the user selected a file 
    if (file != null && file.ContentLength > 0) 
    { 
     // extract only the fielname 
     var fileName = Path.GetFileName(file.FileName); 
     // store the file inside ~/App_Data/uploads folder 
     var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 
     file.SaveAs(path); 
    } 
    // redirect back to the index action to show the form once again 
    return RedirectToAction("Index");   
    } 
} 

Mô hình của tôi đây là

public class FileDescription 
{ 
    public int FileDescriptionId { get; set; } 
    public string Name { get; set; } 
    public string WebPath { get; set; } 
    public long Size { get; set; } 
    public DateTime DateCreated { get; set; } 
} 

Điều là tôi muốn tải tệp lên cơ sở dữ liệu và sau đó WebPath là liên kết đến tệp của tôi. Tôi hy vọng tôi đã làm cho bản thân mình đủ rõ ràng. Bất kỳ trợ giúp sẽ thực sự được đánh giá cao. Cảm ơn

+0

Tôi muốn cơ sở dữ liệu của tôi để có chỉ đường dẫn đến tập tin, không phải là tập tin đó. – Robert

+0

Bạn có thể xác định ý nghĩa của từ "xem tệp" không, bạn có muốn hiển thị nó dưới dạng liên kết hay bạn muốn hiển thị nội dung thực tế của tệp không? –

Trả lời

10

Bạn có thể truy cập tệp phía máy chủ (để truy cập nội dung từ ứng dụng ASP.NET) - chỉ cần sử dụng Server.MapPath("~/App_Data/uploads/<yourFileName>") để nhận đường dẫn tuyệt đối (ví dụ: C:/inetpub/wwwroot/MyApp/Add_Data/MyFile .txt).

Nội dung thư mục App_Data không thể truy cập trực tiếp theo URL vì lý do bảo mật. Tất cả các cấu hình, cơ sở dữ liệu được lưu trữ ở đó vì vậy nó khá rõ ràng lý do tại sao. Nếu bạn cần tệp được tải lên của mình để truy cập qua URL - hãy tải tệp đó lên một số thư mục khác.

Tôi đoán bạn cần tệp đó để truy cập được qua web. Trong trường hợp này, giải pháp đơn giản nhất là giữ tên tệp (hoặc đường dẫn tuyệt đối đầy đủ như đã đề cập ở đầu) vào tệp của bạn trong cơ sở dữ liệu và tạo hành động điều khiển sẽ lấy tên tệp và trả về nội dung tệp của bạn.

0

Bạn nên sử dụng trình xử lý chung để truy cập tệp. IMO lưu trữ hình ảnh/tập tin trong thư mục App_Data là thực hành tốt nhất, vì nó không phục vụ các tập tin theo mặc định.

Tất nhiên nó phụ thuộc vào nhu cầu của bạn. Nếu bạn không quan tâm đến việc ai có thể truy cập hình ảnh, thì chỉ cần tải chúng lên thư mục bên ngoài thư mục app_data :)

Tất cả đều tùy thuộc vào nhu cầu của bạn.

8

Trong trường hợp nó giúp mọi người, đây là một ví dụ đơn giản cho một PDF:

public ActionResult DownloadPDF(string fileName) 
{ 
    string path = Server.MapPath(String.Format("~/App_Data/uploads/{0}",fileName)); 
    if (System.IO.File.Exists(path)) 
    { 
     return File(path, "application/pdf"); 
    } 
    return HttpNotFound(); 
} 
Các vấn đề liên quan