2012-06-18 28 views
6

Có cách nào tôi có thể phát hiện một URL hình ảnh, như:Phát hiện URL hình ảnh trong C#/NET

http://mysite.com/image.jpg 

nhưng với các định dạng khác nữa? Tôi đang sử dụng C# với .NET 4.0.

Something như

bool isImageUrl(string URL){ 
} 

chỉnh sửa Tôi có nghĩa là nếu các điểm URL để một hình ảnh. Ví dụ, URL

http://mysite.com/image.jpg 

một hình ảnh hợp lệ, nhưng

http://mysite.com/image 

thì không.

+0

Bạn đang hỏi cách xác định hậu tố tệp hoặc nếu đối tượng là hình ảnh thực tế? –

+0

Tôi không nghĩ rằng bản chỉnh sửa đã làm cho nó rõ ràng hơn nhiều. Lưu ý rằng http://www.gravatar.com/avatar/7deca8ec973c3c0875e9a36e1e3e2c44?s=64&d=identicon&r=PG là một hình ảnh hợp lệ. Bạn cũng muốn điều đó trở lại đúng không? – dodexahedron

+0

Tôi nghĩ rằng liên kết này có thể giúp bạn [Link 1] [1] [1]: http://stackoverflow.com/questions/3228984/a-better-way-to-validate-url -in-c-sharp-so-try-catch –

Trả lời

6

Bạn có thể gửi yêu cầu HTTP tới URL (sử dụng HttpWebRequest) và kiểm tra xem trả lại ContentType có bắt đầu bằng image/ hay không.

1

Bạn chỉ có thể kiểm tra chuỗi bằng .EndsWith() cho từng bộ chuỗi bạn xác định.

Nếu bạn muốn biết đối tượng tại URL đó là thực sự là một hình ảnh, bạn sẽ phải tự thực hiện yêu cầu web và kiểm tra tiêu đề HTTP kiểu nội dung.

Thậm chí, điều đó có thể không chính xác, tuy nhiên, tùy thuộc vào máy chủ.

+1

Sai. http://www.gravatar.com/avatar/7deca8ec973c3c0875e9a36e1e3e2c44?s=64&d=identicon&r=PG – SLaks

+0

Cả hai đều có thể sai hoặc phải (tải xuống tất cả hình ảnh để kiểm tra loại của chúng?), vấn đề nằm trong câu hỏi chính nó –

+0

Đó là chính xác như câu hỏi cho phép nó được. Một số máy chủ web cũ hơn sẽ không có ánh xạ kiểu MIME chính xác, dù sao, đặc biệt là đối với jpeg2000, png và có lẽ một vài định dạng khác sẽ kết thúc khi ứng dụng/octet-stream. – dodexahedron

3

Bạn có thể chỉ cần kiểm tra xem liệu URL có kết thúc bằng phần mở rộng tệp hình ảnh đã biết không. Tuy nhiên, một phương pháp an toàn hơn là để thực sự tải về tài nguyên và kiểm tra, cho dù nội dung bạn nhận được thực sự là một hình ảnh:

public static bool IsUrlImage(string url) 
{ 
    try 
    { 
     var request = WebRequest.Create(url); 
     request.Timeout = 5000; 
     using (var response = request.GetResponse()) 
     { 
      using (var responseStream = response.GetResponseStream()) 
      { 
       if (!response.ContentType.Contains("text/html")) 
       { 
        using (var br = new BinaryReader(responseStream)) 
        { 
         // e.g. test for a JPEG header here 
         var soi = br.ReadUInt16(); // Start of Image (SOI) marker (FFD8) 
         var jfif = br.ReadUInt16(); // JFIF marker (FFE0) 
         return soi == 0xd8ff && jfif == 0xe0ff; 
        } 
       } 
      } 
     } 
    } 
    catch (WebException ex) 
    { 
     Trace.WriteLine(ex); 
     throw; 
    } 
    return false; 
} 
+2

Trong khi điều này sẽ làm việc, tôi ghét để khuyến khích nó. Bạn có thể tưởng tượng số lượng yêu cầu web mà một ứng dụng có thể tạo ra cho một loạt các máy chủ web vô tội với một cái gì đó như thế này không? Tôi biết chúng tôi đang ở đây để giúp đỡ, nhưng bây giờ tôi cảm thấy khó chịu về việc trả lời này ... – dodexahedron

+0

Huh? Lớp WebRequest phải làm gì với nhận xét của tôi?Trong mọi trường hợp, vâng, tôi nhận ra rằng một URI không mang ý nghĩa bẩm sinh. Tôi chỉ đơn giản là bình luận về thực tế rằng, trong khi đây là một giải pháp * kỹ thuật chính xác *, nó không nhất thiết phải là một giải pháp * tốt * hoặc * *, cho ứng dụng đã cho. Hãy xem xét trường hợp ai đó xây dựng một chỉ mục của một loạt các hình ảnh. Một yêu cầu duy nhất cho một trang web với 1000 liên kết hình ảnh trên đó tạo ra 1000 yêu cầu HTTP. Yay. Một lần nữa, tôi nhận ra rằng chúng tôi chỉ ở đây để trả lời các câu hỏi, nhưng câu hỏi chính nó khiến tôi tin rằng việc sử dụng sẽ không phù hợp. – dodexahedron

+0

Nó không khác gì. Tôi chỉ không muốn đưa ra nhận xét giống nhau về ba bài viết với cùng một câu trả lời. : P Vấn đề của tôi không phải là với phương pháp. Tôi chỉ đơn giản là chọn để đặt nó trên bài viết của bạn vì nó là ví dụ tốt nhất của ba bài viết với cùng một câu trả lời. – dodexahedron

10

Bạn tự xác định được nó bằng cách sử dụng phương pháp HEAD của Http (mà không cần tải toàn bộ hình ảnh)

bool IsImageUrl(string URL) 
{ 
    var req = (HttpWebRequest)HttpWebRequest.Create(URL); 
    req.Method = "HEAD"; 
    using (var resp = req.GetResponse()) 
    { 
     return resp.ContentType.ToLower(CultureInfo.InvariantCulture) 
        .StartsWith("image/"); 
    } 
} 
+4

Lưu ý rằng không phải tất cả các máy chủ đều xử lý 'HEAD' và bạn nên chuyển' OrdinalIgnoreCase' thành 'StartsWith'. – SLaks

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