2013-01-14 25 views
6

Tôi đã cố gắng tạo (TFileStream) một tệp PDF thông qua lớp TDownloadURL, nhưng tôi thực sự gặp khó khăn trong việc lấy tệp/luồng từ URL, đặc biệt nếu URL là HTTPS.TDownloadURL không thể tải xuống từ HTTPS

Tôi không chắc chắn nếu tôi là rõ ràng, nhưng tôi sẽ đăng một đoạn mã để nó có thể giúp hiểu biết:

implementation 
var pdfStreamed: TDownloadUrl; 
var fileStream : TFileStream; 
    procedure generateStream; 
    begin 
    pdfStreamed:= TDownLoadURL.Create(nil); 
    with pdfStreamed do 
     begin 
     URL := 'https://farm9.staticflickr.com/8327/8106108098_08e298f0d9_b.jpg'; //stream; 
     FileName := 'D:\'; 
     ExecuteTarget(nil); 
//  Execute; 
     end; 
    end; 

Thuộc tính URL tồn tại ở cả HTTP như trong HTTPS! Nhưng nó ném cho tôi một lỗi: Loại ngoại lệ Ngoại lệ với thông báo 'Lỗi tải xuống URL: https://farm9.staticflickr.com/8327/8106108098_08e298f0d9_b.jpg'.

Có thể cho biết tôi đang làm gì sai? Tôi đã tìm kiếm rất nhiều cho điều này, nhưng không thể tìm thấy bất cứ điều gì mà làm việc và đơn giản!

Cảm ơn rất nhiều!

Trả lời

5

TDownloadURL chỉ là một trình bao bọc mỏng xung quanh chức năng URLDownloadToFile() của Microsoft, hỗ trợ HTTPS tốt.

TDownloadURL không cho bạn biết lý do tại sao URLDownloadToFile() không thành công. Tuy nhiên, tôi có thể thấy rằng bạn đang đặt thuộc tính FileName thành chỉ đường dẫn thư mục nhưng thay vào đó bạn cần đặt nó thành đường dẫn đầy đủ và tên tệp của tệp đích sẽ được tạo để giữ dữ liệu đã tải xuống. IOW, thay đổi này:

FileName := 'D:\'; 

Để này:

FileName := 'D:\8106108098_08e298f0d9_b.jpg'; 
+0

Hey @Remy cảm ơn câu trả lời nhưng tôi đã thử giải pháp này và nó không hoạt động! Nó tiếp tục hiển thị "Lỗi tải xuống URL". Tôi hiểu nó chỉ là một wrapper, nhưng có thể Deplhi ảnh hưởng đến cuộc gọi này theo cách Nó sẽ ném cho tôi một lỗi? : \ Nhân tiện, nếu tôi thay thế HTTPS bằng HTTP thì nó hoạt động! Nhưng tôi thực sự cần HTTPS = \ –

+0

Thông báo lỗi mà bạn đang thấy có nghĩa là 'URLDownloadToFile()' không thành công, không phải 'TDownloadURL'. Nó chỉ là một cuộc gọi hàm API bình thường đơn giản. Nếu bạn muốn tìm hiểu tại sao 'URLDownloadToFile()' không thành công, bạn cần gọi nó trực tiếp để bạn có quyền truy cập vào mã lỗi kết quả của nó, mà 'TDownloadURL' không cho phép truy cập. –

3

Sử dụng Remy của câu trả lời của việc thay đổi tên tập tin để xác định địa điểm chính xác để tiết kiệm, nhưng để sửa chữa, thay đổi dòng ExecuteTarget của bạn để một cái gì đó giống như

ExecuteTarget(Self);

Tôi vừa thử mã của bạn với hai thay đổi đó và đã tải xuống thành công hình ảnh. Về cơ bản, thành phần cần xử lý để tham chiếu từ Here