2015-06-16 31 views
6

Xin chào, tôi đang cố gắng đưa hình ảnh của mình vào trình chiếu tôi có trên chỉ mục của mình. các hình ảnh được lưu trên storage/app, và sau đó phần còn lại của con đường tôi lấy lại từ cơ sở dữ liệu của tôi.Không thể tải hình ảnh từ bộ nhớ laravel 5

Tôi đã quản lý để xuất đường dẫn chính xác trên thẻ <img src> và tiêu đề được xuất như mong muốn nhưng hình ảnh sẽ không xuất hiện.

tôi gửi và mảng từ bộ điều khiển và sau đó lướt qua nó trên quan điểm của tôi:

Bộ điều khiển:

public function index() 
{ 
    $projects = Project::all()->take(4); 
    return view('index' , compact('projects')); 

} 

xem Index

@foreach($projects as $project) 
{{$storagePath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()}} 
<li><img src="{{$storagePath.$project->fetchMedia->first()->public_name}}" title=" {{$project->name}}"></li> 
     @endforeach 

Sản lượng HTML là con đường đúng: "/home/vagrant/project/storage/app/projects/Domaa6.jpg"

nhưng thực hiện không hiển thị hình ảnh.

Tôi đã cố gắng sử dụng HTML :: helper hình ảnh nhưng cũng không thành công.

là có cách nào để làm cho nó hoạt động như vậy hoặc tôi có cần tạo bộ điều khiển mới để thao tác hình ảnh của mình không?

fetchMedia là chức năng trên mẫu của tôi trả về Phương tiện của tôi.

public function fetchMedia() 
{ 
    return $this->hasMany('App\Media'); 
} 

Trả lời

11

Những gì bạn đang cố gắng làm là không thể trong thư mục lưu trữ nhưng có thể chỉ trong thư mục công cộng, cũng phơi bày con đường hoặc URL vào thư mục lưu trữ laravel của bạn tạo ra một số lỗ hổng và thực hành xấu của nó

Tuy nhiên có một cách để workaround nó:

Trước tiên, bạn cần một gói hình ảnh để tạo ra hình ảnh động khi một tuyến đường nhất định là tham chiếu, tôi rec ommend intervention/image có nhiều phương pháp giúp hình ảnh dễ dàng quản lý.

Để đạt được điều này thực hiện các bước sau:

1. Cài đặt can thiệp ảnh:

Thêm Can thiệp Hình ảnh để soạn nhạc yourr.json và làm composer update

"require": { 
     "php": ">=5.5.9", 
     "laravel/framework": "5.1.*", 
     "intervention/image": "2.*", 
     "intervention/imagecache": "2.*" 

     ..... 

Trong mảng cung cấp $ thêm các nhà cung cấp dịch vụ cho gói này.

'Intervention\Image\ImageServiceProvider' 

Thêm mặt tiền của gói này vào mảng $ aliases.

'Image' => 'Intervention\Image\Facades\Image '

Cấu hình can thiệp Hình ảnh trong Laravel 5

$ php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5" 

Xuất bản cấu hình trong Laravel 4

$ php artisan config:publish intervention/image 

Để biết thêm chi tiết cài đặt https://github.com/Intervention/image

Sau khi bạn cài đặt can thiệp/hình ảnh mà bạn có thể làm một cái gì đó như thế này:

Image::make($path=storage_path('stock-photos/image1.jpg'));

2. Thiết lập một lộ trình mà sẽ xử lý hình ảnh yêu cầu

Route::get('stock-photos/{image}', function($image){ 

    //do so other checks here if you wish 

    if(!File::exists($image=storage_path("stock-photos/{$image}"))) abort(404); 

    return Image::make($image)->response('jpg'); //will ensure a jpg is always returned 
}); 

3. Rồi sau trong chế độ xem bạn có thể làm:

@foreach($projects as $project) 
    <li> 
     <img src="{{url('stock-photos/'. $project->fetchMedia->first()->public_name)}}" title="{{$project->name}}"> 
    </li> 
@endforeach 
+1

Bạn có nghĩ rằng nó sẽ tải trên máy chủ không? –

0

khi hiển thị hình ảnh bạn không cần tham chiếu đến đường dẫn tệp. Những gì được đưa vào thẻ img là URL đến hình ảnh bạn muốn hiển thị. Vì vậy, trong trường hợp này, bạn sẽ là

@foreach($projects as $project) 
    {{$storagePath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()}} 
    <li><img src="/{{$project->fetchMedia->first()->public_name}}" title=" {{$project->name}}"></li> 
@endforeach 

Nhưng. điều này sẽ không hoạt động như tài nguyên mà bạn thực hiện yêu cầu http để có thể truy cập công khai. (như css, js-scripts, hình ảnh). Với điều này đang được nói, bạn cần phải lưu trữ hình ảnh của bạn ở một vị trí khác, thư mục công cộng là nơi hoàn hảo cho việc này. Nếu bạn lưu hình ảnh của bạn ví dụ như trong public/images/projects sau đó theo quan điểm của bạn, bạn sẽ tham khảo chúng như thế này

<img src="/images/projects/{{$project->fetchMedia->first()->public_name}}" /> 
+0

@AndrewMalinnkovi đã làm việc trên thư mục công cộng giống như cách bạn nói, nhưng khách hàng của tôi đã yêu cầu các hình ảnh phải được lưu trữ trên lưu trữ/app/ImageName, đó là lý do tại sao im đấu tranh. – marybane

+0

khách hàng của bạn sẽ thất vọng nhưng điều này không thể thực hiện được. Máy chủ gốc là thư mục công cộng và mọi thứ vượt ra ngoài đó không thể truy cập được đối với trình duyệt. Bạn có thể thao tác hình ảnh tuy nhiên bạn muốn ở phía máy chủ, nhưng không phải là "giao diện người dùng". Bạn có thể đề xuất tài nguyên lưu trữ của khách hàng trên máy chủ Amazon s3, khá linh hoạt và linh hoạt hơn thay vì giữ chúng cục bộ –

+0

Có, nó gây hiểu lầm vì nó ngụ ý thư mục lưu trữ là cách dễ dàng ưu tiên để lưu trữ tệp [link] http: //laravel.com/docs/5.0/filesystem#basic-usage – martyn

2

Thật không may tôi không thể bình luận về bài viết của Digitlimit (vì tôi chưa đủ cao trong danh tiếng) nhưng phản ứng của họ đã làm việc cho tôi nhưng với một thay đổi. Thay vì trả lại Image::make($image), tôi đã sử dụng phương thức response() vì điều này dường như tạo nội dung tiêu đề cho tôi. Vì vậy, ví dụ:

Route::get('stock-photos/{image}', function($image){ 

if(!File::exists($image=storage_path("stock-photos/{$image}"))) abort(404); 

$returnImage = Image::make($image); 

return $returnImage->response(); 
}); 

Hy vọng rằng sẽ giúp những người khác có vấn đề tương tự.

+0

Tôi nghĩ bạn có thể nhận xét với 49 đại diện? Tôi nghĩ rằng nếu bạn hoàn thành hồ sơ của mình hoặc để bạn có thể nhận xét. Hình ảnh can thiệp có nhiều phương thức và phản hồi() cũng tốt và tôi bỏ qua nó do lỗi. sẽ chỉnh sửa câu trả lời của tôi. cảm ơn. một phiếu bầu cho bạn – Digitlimit

+0

Cảm ơn bạn đã bỏ phiếu vì tôi có thể bình luận :) nhưng câu trả lời của bạn thật tuyệt vời và làm việc cho tôi cảm ơn bạn. – Flyingearl

+0

Điều cần biết. Không có chi – Digitlimit

0

Mặc dù tôi đã sử dụng Laravel trong khoảng 2 năm nay, tôi vừa mới bắt đầu xử lý hình ảnh tải lên với nó rất gần đây (sử dụng phiên bản 5.3.16). xử lý ảnh xử lý sự cố đưa tôi đến với Stack Overflow bài này ... Câu trả lời được chấp nhận ban đầu khá nhiều giải quyết được vấn đề mà tôi đã có, với một số thay đổi nhỏ như sau:

Route::get('images/books/{book_id}/{image}', function($book_id, $image){ 

    $storagePath = Storage::disk('public')->getDriver()->getAdapter()->getPathPrefix(); 
    $imageFilePath = $storagePath . "images/books/{$book_id}/{$image}"; 
    if(!File::exists($imageFilePath)) abort(404); 

    return Image::make($imageFilePath)->response(); 
}); 

Trong ví dụ cụ thể này, tôi muốn lấy một hình ảnh được tải lên cụ thể cho một cuốn sách. Đối với cuốn sách đã cho, tôi đã tạo một thư mục phù hợp với I.D của cuốn sách và đã tải hình ảnh lên đó.

Để truy xuất hình ảnh, trước tiên tôi nhận được thư mục lưu trữ công khai. Điều này thường được định nghĩa trong tập tin cấu hình 'filesystems.php' trong thư mục config/app. Ví dụ của tôi là bên dưới (các phần bổ sung bị bỏ qua không cần thiết cho câu trả lời này):

<?php 

return [ 

    /* 
    |-------------------------------------------------------------------------- 
    | Default Filesystem Disk 
    |-------------------------------------------------------------------------- 
    | 
    | Here you may specify the default filesystem disk that should be used 
    | by the framework. A "local" driver, as well as a variety of cloud 
    | based drivers are available for your choosing. Just store away! 
    | 
    | Supported: "local", "ftp", "s3", "rackspace" 
    | 
    */ 

    'default' => 'local', 

    . 
    . 
    . 

    'disks' => [ 

     'public' => [ 
      'driver' => 'local', 
      'root' => storage_path('app/public'), 
      'visibility' => 'public', 
     ], 

    ], 

]; 

Phần còn lại của thông tin tuyến đường theo cùng mẫu với câu trả lời được chấp nhận đầu tiên. Hiển thị hình ảnh cũng tuân theo câu trả lời được chấp nhận.

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