将图像上传到 AWS S3 而不是推送到边缘服务器
Uploaded images to AWS S3 not pushing to edge servers
我有一个指向 S3 存储桶的映射本地驱动器 (X:)。
我正在使用以下代码将上传的图片推送到它。
public void copyData( MultipartFile file, String dest ) throws RecoverableFileApiException {
try {
String path = FilenameUtils.getFullPath( dest );
File fileDir = new File( path );
String fileName = FilenameUtils.getName( dest );
File outFile = new File( fileDir, fileName );
if ( !fileDir.exists() ) {
FileUtils.forceMkdir( fileDir );
}
file.transferTo(outFile);
FileUtils.touch( outFile );
//fileDir.setLastModified( System.currentTimeMillis() );
}
catch ( IOException e ) {
throw new RecoverableFileApiException( log, "There was a problem copying data file to " + dest, e, FILE_UNABLE_TO_COPY_FILE );
}
}
它创建相关目录(X:\uploads\category1)并在第一次上传文件时将文件放入其中。文件图像已正确提供(可从浏览器查看)。
当我添加新图片时,它们会被放入同一个目录(X:\uploads\category1),并且图片也可以正常运行。
但是好像没有推送到边缘服务器。
当我通过浏览器查看时,它下载图像而不是显示。
在 Chrome 网络选项卡中,我可以看到它被用作内容长度为 0 的 'binary/octet-steam' 内容类型。
好像 aws 文件夹需要在目录级别上踢一下才能让它们获取添加到目录中的新文件?
当我通过手动 copy/paste 图像到目录中执行相同操作时,它可以很好地为它们提供服务。
目前 table 暂时无法使用 AWS API,当然除非没有它们就无法工作。
稍后将按照 John 的建议使用 API 实施。
现在,通过以下方式让它工作:
- 使用临时名称
在本地驱动器上创建文件
- 将文件复制到映射驱动器
- 将映射驱动器上的文件重命名为正确的名称。
- 完成,被推送到边缘服务器。
重命名映射驱动器(S3 存储桶)上的文件会强制在有人下次请求时提供新图像。
public void copyDataToCDN( InputStream is, String dest ) throws RecoverableFileApiException {
FileOutputStream os = null;
File tmpLocalFile = null;
try {
String path = FilenameUtils.getFullPath( dest );
File fileDir = new File( path );
String fileName = FilenameUtils.getName( dest );
File outFile = new File( fileDir, fileName );
if ( !fileDir.exists() ) {
FileUtils.forceMkdir( fileDir );
}
if ( outFile.exists() ) {
outFile.delete();
}
// Temporarily copy to local file system
String tmpLocalDir = System.getProperty( "java.io.tmpdir" );
String tmpDest = tmpLocalDir + "temp_" + fileName;
String tmpPath = FilenameUtils.getFullPath( tmpDest );
File tmpFileDir = new File( tmpPath );
String tmpFileName = FilenameUtils.getName( tmpDest );
tmpLocalFile = new File( tmpFileDir, tmpFileName );
os = new FileOutputStream( tmpLocalFile );
IOUtils.copy( is, os );
// Copy temp file to Mapped CDN Drive
String tmpCDNFileName = "temp_" + fileName;
File tmpCDNFile = new File( fileDir, tmpCDNFileName );
FileUtils.copyFile( tmpLocalFile, tmpCDNFile );
// Rename temp file on Mapped CDN Drives
File finalCDNFile = new File( fileDir, fileName );
tmpCDNFile.renameTo( finalCDNFile );
}
catch ( IOException e ) {
throw new RecoverableFileApiException( log, "There was a problem copying data file to " + dest, e, FILE_UNABLE_TO_COPY_FILE );
}
finally {
IOUtils.closeQuietly( is );
IOUtils.closeQuietly( os );
if ( tmpLocalFile != null ) {
tmpLocalFile.delete();
}
}
}
我有一个指向 S3 存储桶的映射本地驱动器 (X:)。
我正在使用以下代码将上传的图片推送到它。
public void copyData( MultipartFile file, String dest ) throws RecoverableFileApiException {
try {
String path = FilenameUtils.getFullPath( dest );
File fileDir = new File( path );
String fileName = FilenameUtils.getName( dest );
File outFile = new File( fileDir, fileName );
if ( !fileDir.exists() ) {
FileUtils.forceMkdir( fileDir );
}
file.transferTo(outFile);
FileUtils.touch( outFile );
//fileDir.setLastModified( System.currentTimeMillis() );
}
catch ( IOException e ) {
throw new RecoverableFileApiException( log, "There was a problem copying data file to " + dest, e, FILE_UNABLE_TO_COPY_FILE );
}
}
它创建相关目录(X:\uploads\category1)并在第一次上传文件时将文件放入其中。文件图像已正确提供(可从浏览器查看)。
当我添加新图片时,它们会被放入同一个目录(X:\uploads\category1),并且图片也可以正常运行。
但是好像没有推送到边缘服务器。
当我通过浏览器查看时,它下载图像而不是显示。
在 Chrome 网络选项卡中,我可以看到它被用作内容长度为 0 的 'binary/octet-steam' 内容类型。
好像 aws 文件夹需要在目录级别上踢一下才能让它们获取添加到目录中的新文件?
当我通过手动 copy/paste 图像到目录中执行相同操作时,它可以很好地为它们提供服务。
目前 table 暂时无法使用 AWS API,当然除非没有它们就无法工作。
稍后将按照 John 的建议使用 API 实施。
现在,通过以下方式让它工作:
- 使用临时名称
在本地驱动器上创建文件
- 将文件复制到映射驱动器
- 将映射驱动器上的文件重命名为正确的名称。
- 完成,被推送到边缘服务器。
重命名映射驱动器(S3 存储桶)上的文件会强制在有人下次请求时提供新图像。
public void copyDataToCDN( InputStream is, String dest ) throws RecoverableFileApiException {
FileOutputStream os = null;
File tmpLocalFile = null;
try {
String path = FilenameUtils.getFullPath( dest );
File fileDir = new File( path );
String fileName = FilenameUtils.getName( dest );
File outFile = new File( fileDir, fileName );
if ( !fileDir.exists() ) {
FileUtils.forceMkdir( fileDir );
}
if ( outFile.exists() ) {
outFile.delete();
}
// Temporarily copy to local file system
String tmpLocalDir = System.getProperty( "java.io.tmpdir" );
String tmpDest = tmpLocalDir + "temp_" + fileName;
String tmpPath = FilenameUtils.getFullPath( tmpDest );
File tmpFileDir = new File( tmpPath );
String tmpFileName = FilenameUtils.getName( tmpDest );
tmpLocalFile = new File( tmpFileDir, tmpFileName );
os = new FileOutputStream( tmpLocalFile );
IOUtils.copy( is, os );
// Copy temp file to Mapped CDN Drive
String tmpCDNFileName = "temp_" + fileName;
File tmpCDNFile = new File( fileDir, tmpCDNFileName );
FileUtils.copyFile( tmpLocalFile, tmpCDNFile );
// Rename temp file on Mapped CDN Drives
File finalCDNFile = new File( fileDir, fileName );
tmpCDNFile.renameTo( finalCDNFile );
}
catch ( IOException e ) {
throw new RecoverableFileApiException( log, "There was a problem copying data file to " + dest, e, FILE_UNABLE_TO_COPY_FILE );
}
finally {
IOUtils.closeQuietly( is );
IOUtils.closeQuietly( os );
if ( tmpLocalFile != null ) {
tmpLocalFile.delete();
}
}
}