5

Próbuję przesłać, a następnie uzyskać dostęp do obrazu. Przesyłanie przebiega prawidłowo, przesyłając obraz do zasobów/zdjęć, ale gdy próbuję uzyskać dostęp do obrazu z przeglądarki, takiego jak http://localhost:1337/images/image-name.jpg, daje to 404. Używam Sails.js tylko do celów zaplecza - w przypadku interfejsu API i projekt jest tworzony z - opcja bez opcji front-end. Mój front jest na AngularJS.Dostęp do przesłanego obrazu w projekcie zaplecza Sails.js

Moja funkcja wysyłania:

avatarUpload: function(req, res) { 
    req.file('avatar').upload({ 
     // don't allow the total upload size to exceed ~10MB 
     maxBytes: 10000000, 
     dirname: '../../assets/images' 
    }, function whenDone(err, uploadedFiles) { 
     console.log(uploadedFiles); 
     if (err) { 

      return res.negotiate(err); 
     } 

     // If no files were uploaded, respond with an error. 
     if (uploadedFiles.length === 0) { 

      return res.badRequest('No file was uploaded'); 
     } 

     // Save the "fd" and the url where the avatar for a user can be accessed 
     User 
      .update(req.userId, { 

       // Generate a unique URL where the avatar can be downloaded. 
       avatarUrl: require('util').format('%s/user/avatar/%s', sails.getBaseUrl(), req.userId), 

       // Grab the first file and use it's `fd` (file descriptor) 
       avatarFd: uploadedFiles[0].fd 
      }) 
      .exec(function (err){ 
       if (err) return res.negotiate(err); 
       return res.ok(); 
      }); 
    }); 
} 

widzę obraz w folderze aktywa/Images - coś takiego - 54cd1fc5-89e8-477d-84e4-dd5fd048abc0.jpg

http://localhost:1337/assets/images/54cd1fc5-89e8-477d-84e4-dd5fd048abc0.jpg - daje 404

http://localhost:1337/images/54cd1fc5-89e8-477d-84e4-dd5fd048abc0.jpg - daje 404

Odpowiedz

5

Dzieje się tak dlatego, że zasoby twoi dostępy aplikacyjne nie są dostępne bezpośrednio z katalog assets, ale katalog .tmp w katalogu głównym projektu.

Po zniesieniu żagli zasoby są kopiowane do katalogu .tmp, więc wszystko dodane po podniesieniu nie jest dostępne w .tmp.

Zazwyczaj po przesłaniu pliku przesyłam plik .tmp i copy do assets. W ten sposób assets nie jest zanieczyszczony w przypadku, gdy przesyłanie nie powiedzie się z jakiegokolwiek powodu.

Daj nam znać, jeśli to działa. Powodzenia!

Aktualizacja Znaleziono odpowiednie link dla tego.

+1

Dziękuję bardzo. Udało mi się przesłać i uzyskać dostęp do zdjęcia po dostarczonym samouczku. Naprawdę mi pomógł. Jedną małą rzeczą, na którą należy zwrócić uwagę - podczas kopiowania przesłanego pliku z zasobów do folderu '.tmp', jeśli nie ma tam struktury folderów -' .tmp/public/images/uploads', musimy ją najpierw utworzyć lub 'fs 'błąd powoduje przerwanie aplikacji, jeśli nie zostanie przechwycony. –

+1

Rzeczywiście! Możesz skorzystać z modułu [mkdirp] (https://www.npmjs.com/package/mkdirp) lub [fs-extra] (https://www.npmjs.com/package/fs-extra) (dla dodatkowej funkcjonalności), aby utworzyć folder, jeśli nie istnieje za pomocą pojedynczego polecenia. Lub po prostu użyj tego [dobrze uzasadnionego rozwiązania] (http://stackoverflow.com/a/21196961/1100528). – galactocalypse