我已经在Google上搜索了一些有效的图像存储解决方案,并获得了非常令人兴奋的一句话,即您应该仅将图像路径而不是整个图像存储在数据库中。
现在,我正在基于MVC的Java Web项目上工作,并且也愿意对此主题有所了解。具体来说,我想知道是否可以将图像直接从我的图像保存到任何图像托管网站,Servlet该网站立即为我提供一个链接,该链接将存储在数据库列中以备将来使用?
Servlet
您应该只将图像路径而不是整个图像存储在数据库中。
确实是推荐的。在数据库中存储二进制数据在语义上完全没有意义。您无法为其编制索引,也无法在其中进行搜索等。只是“死”数据。您可以将其直接存储在磁盘文件系统上,然后将其唯一标识符(通常只是文件名)存储在数据库中。文件名可以是可索引的varchar(因此允许更快SELECT ... WHERE)。
SELECT ... WHERE
我想知道是否可以将图像直接从Servlet保存到任何图像托管网站,该网站立即为我提供一个链接,该链接将存储在数据库列中以备将来使用?
我不确定您在这里有什么具体问题。您应该意识到,传输字节毕竟只是读取任意数据InputStream并将其写入仲裁的问题OutputStream。您的具体问题应该是“如何获取InputStream上载的映像?”或“如何获取OutputStream本地磁盘文件系统?”,或者也许是“如何获取OutputStream映像托管网站?”。 ”。
InputStream
OutputStream
获取上传的图像InputStream很容易。所有不错的文件上传API都提供了一种getInputStream()方法。另请参阅如何使用JSP /Servlet将文件上传到服务器?获得一个OutputStream到File本地磁盘文件系统上也很容易。只需FileOutputStream在其周围构造一个即可。
getInputStream()
File
FileOutputStream
File file = File.createTempFile(prefix, suffix, "/path/to/uploads"); InputStream input = uploadedFile.getInputStream(); OutputStream output = new FileOutputStream(file); // Now write input to output. String uniqueFileName = file.getName(); // Now store filename in DB.
获得一个OutputStream到其他主机相距一个故事。您想如何连接到它?使用FTP?使用FTPClient#appendFileStream()。还是使用HTTP(eek)?使用URLConnection#getOutputStream()或HttpClient。如果卡住,您应该问一个更细粒度的问题。
FTPClient#appendFileStream()
URLConnection#getOutputStream()