2011-10-11 36 views
9

Tôi đang tìm cách để (dễ dàng, theo sở thích;)) tạo liên kết tải xuống tệp trên máy chủ tệp riêng biệt.Tạo liên kết tải xuống tệp trên máy chủ tệp

Tình hình như sau: ứng dụng tôi đang phát triển (asp.net 2.0 trong vb.net nhưng tôi có vấn đề tương tự trong C#, hoặc giải pháp làm việc cho tôi) sẽ được chạy nội bộ cho một công ty. Thực hành tốt, lưu trữ tệp và ứng dụng web nằm trên hai máy chủ riêng biệt.

Tôi về cơ bản cần có khả năng tạo liên kết tải xuống tệp, URL duy nhất mà tôi có để truy cập tệp là \ servername \ folder1 \ folder2 \ folder3 \ file.txt (có thể là bất kỳ loại nào file)

Liên kết web chỉ đơn giản là không hoạt động. Đây là cách thiết lập hiện tại:

tablerowfield.Text = String.Format(
    "<a href=""\\servername\folder1\folder2\folder3\{0}"" 
     target=""_blank"">Click me</a>", 
    filename) 

Điều này không có lý do rõ ràng. Nó được sử dụng để được thiết lập để viết tập tin đó vào đường dẫn ứng dụng và nó hoạt động hoàn hảo, nhưng nó không phải là thực hành tốt và đó là lý do tại sao tôi thay đổi nó (hoặc cố gắng).

Tôi đọc các giải pháp về cách tạo trang tải xuống và sau đó có bảng trong DB chứa liên kết và trả lại URL web thích hợp để tải xuống nhưng thời gian ràng buộc tôi gặp phải không cho phép tôi phát triển.

Giả sử tôi có thể cung cấp chuỗi có filepath đầy đủ cho tệp như trên, cách dễ nhất để tạo liên kết khi được nhấp, tải xuống tài liệu là gì?

Lưu ý: Tôi có 0 quyền quản trị trong môi trường này. Điều đó thực sự không giúp tôi. Giả sử tôi được cung cấp liên kết chính xác như trên và có quyền truy cập tệp thích hợp và như vậy.

UPDATE:

Ví dụ trên làm việc trong IE, nhưng không phải trong Firefox và Chrome. IE chuyển đổi nó thành một tập tin: // servername/... liên kết mà nó có nghĩa là gì, nhưng FF và Chrome đều tích cực quyết định rằng điều này là không an toàn và đã vô hiệu hóa nó từ trình duyệt của họ.

Trả lời

16

Bạn có thể sử dụng tập tin ASHX (nói, downloadfile.ashx) và sử dụng đoạn mã sau (không dự thi, nhưng nó sẽ là một cái gì đó như thế) trong đó:

Response.Clear(); 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("Content-Disposition", "attachment; filename=abc.txt");            
Response.WriteFile(Server.MapPath("\\servername\folder1\folder2\folder3\abc.txt")); 
Response.End(); 

và sau đó sử dụng này trong neo của bạn thẻ như:

<a href="downloadfile.ashx" target=""_blank"">Click me</a> 

Lưu ý: Bạn cũng có thể vượt qua các thông số để tải về các file khác nhau như:

<a href="downloadfile.ashx?file=abc.txt" target=""_blank"">Click me</a> 

và sau đó, trong tệp ashx, hãy sử dụng tên tệp để tải xuống tệp thích hợp.

+0

Ok tôi đã xử lý làm việc, nhưng nó giữ gving tôi sai sót trong Response.WriteFile. Tôi nhập một chuỗi các hình thức "\\ server \ folder \ file.txt" và tôi nhận được: Không thể ánh xạ đường dẫn '/server/folder/file.txt' Tôi đã thử mọi tệp có thể. Bất kỳ trải nghiệm nào về vấn đề này? – Flater

+0

Bạn có thể vượt qua paramter như file = abc.txt cho liên kết đầu tiên, file = otherfile.txt vv như tôi đã đề cập. Vì vậy, bạn sẽ nhận được tên tập tin động và chuyển chúng vào tập tin ASHX. Bạn cần tệp ASHX để bạn có thể cho phép người dùng tải xuống từ đó (tên miền của bạn) thay vì sử dụng đường dẫn máy chủ không tồn tại ở phía máy khách (nếu nó không nằm trong LAN) – wasimbhalli

+0

Ok bỏ qua bài đăng trước của tôi .Mappath và sau đó nó hoạt động :) vẫn còn một chút mờ về hoàn thiện này, nhưng bạn đã giúp tôi rất nhiều khủng khiếp! Cảm ơn! – Flater

0

\\servername\folder1\folder2\folder3\... là đường dẫn UNC không thể được sử dụng từ trình duyệt. Bởi vì (các) tệp đang ở trên một máy chủ riêng biệt, bạn cần có thuộc tính href của biểu mẫu http://server-name/folder1/folder2/file.txt.

Nếu máy chủ tên tuổi là không thể giải quyết bởi các khách hàng, thì bạn cần phải đầu tiên có được địa chỉ IP của máy chủ và sau đó xây dựng các href dạng: http://10.1.1.30/folder1/folder2/file.txt

Đây là cách bạn có được địa chỉ IP từ server-name:

IPAddress[] host; 
host = Dns.GetHostAddresses("server-name"); 
string ip = host[0].ToString();   

EDIT:

tôi về cơ bản cần phải có khả năng tạo ra một liên kết tải về vào một tập tin

Với giải pháp ashx, ứng dụng của bạn sẽ đọc tệp từ máy chủ và chuyển tiếp tệp tới máy khách thay vì chỉ cung cấp cho khách hàng một liên kết để tải xuống tệp trực tiếp từ máy chủ tệp.

3

đoạn mã này sẽ tạo tệp trong thư mục tải xuống có tên = hi.txt và nội dung là "cảm ơn Chúa, tệp cuối cùng đã được tải xuống".

Response.Clear(); 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("Content-Disposition", "attachment; filename=hi.txt"); 
Response.Write("thanks god, finally file got downloaded."); 
Response.End(); 
0

Nếu tập tin của bạn đã có trên máy chủ sau đó bạn có thể sử dụng mã này trong tải sự kiện nhấn nút bạn như thế này

protected void downloadpdf_Click(object sender, EventArgs e) 
{ 
    Response.Clear(); 
    Response.ContentType = "application/octet-stream"; 
    Response.AddHeader("Content-Disposition", "attachment; filename=""downloadName.pdf"""); 
    Response.WriteFile(Server.MapPath(@"~/path of pdf/actualfile.pdf")); 
    Response.End(); 
} 
+0

Mặc dù chính xác, câu trả lời này chính xác giống như câu trả lời tôi đã đánh dấu là giải pháp * gần hai năm trước *. – Flater

Các vấn đề liên quan