我正在为我的产品目录编写自己的图像导入。我想从本地文件系统中读取图像,并将它们存储在配置的assets文件夹中。现在,导入非常简单。它是管理项目中的一个控制器,我通过调用一个url来触发它。
它与文件夹结构一起创建文件,文件似乎具有相同的文件大小,但不知何故,它们在创建过程中变得混乱,它们不再作为图像可读(图片浏览器不会打开它们)。你知道为什么会搞得一团糟吗?
代码如下:
@Controller("blImageImportController")
@RequestMapping("/imageimport")
public class ImageImportController extends AdminAbstractController {
@Value("${image.import.folder.location}")
private String importFolderLocation;
@Resource(name = "blStaticAssetService")
protected StaticAssetService staticAssetService;
@Resource(name = "blStaticAssetStorageService")
protected StaticAssetStorageService staticAssetStorageService;
@RequestMapping(method = {RequestMethod.GET})
public String chooseMediaForMapKey(HttpServletRequest request,
HttpServletResponse response,
Model model
) throws Exception {
File imageImportFolder = new File(importFolderLocation);
if (imageImportFolder.isDirectory()) {
Arrays.stream(imageImportFolder.listFiles()).forEach(directory ->
{
if (directory.isDirectory()) {
Arrays.stream(directory.listFiles()).forEach(this::processFile);
}
});
}
return "";
}
private void processFile(File file) {
FileInputStream fis = null;
try {
HashMap properties = new HashMap();
properties.put("entityType", "product");
properties.put("entityId", file.getParentFile().getName());
fis = new FileInputStream(file);
StaticAsset staticAsset = this.staticAssetService.createStaticAsset(fis, file.getName(), file.length(), properties);
this.staticAssetStorageService.createStaticAssetStorage(fis, staticAsset);
fis.close();
} catch (Exception e) {
} finally {
try {
if (fis != null)
fis.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}发布于 2018-04-05 10:22:12
在StaticAssetService中有一个检查,试图将其检测为图像(请参见https://github.com/BroadleafCommerce/BroadleafCommerce/blob/b55848f/admin/broadleaf-contentmanagement-module/src/main/java/org/broadleafcommerce/cms/file/service/StaticAssetServiceImpl.java#L217-L220)。如果它正确地检测到了这一点,那么您应该在该调用的结果中返回一个ImageStaticAssetImpl。
另一方面是实际读取文件的控制器(呈现StaticAssetView的StaticAssetViewController )。StaticAssetView所做的一件事就是为mimeType设置一个响应头,浏览器使用该响应头来呈现。这是由StaticAssetStorageService:https://github.com/BroadleafCommerce/BroadleafCommerce/blob/b55848f837f26022a620f0c2c143eed7902ba3f1/admin/broadleaf-contentmanagement-module/src/main/java/org/broadleafcommerce/cms/file/service/StaticAssetStorageServiceImpl.java#L213中的这段代码设置的。我怀疑这就是你问题的根源。
另外,请注意,当您自己上传文件时,不需要发送这些属性。这主要是当你上传一个特定实体(如产品或类别)的图片时,在管理员中使用。
https://stackoverflow.com/questions/49644641
复制相似问题