package com.huixinpn.dionysus.storage.bae;
import com.baidubce.auth.BceCredentials;
import com.baidubce.auth.DefaultBceCredentials;
import com.baidubce.services.bos.BosClient;
import com.baidubce.services.bos.BosClientConfiguration;
import com.baidubce.services.bos.model.GeneratePresignedUrlRequest;
import com.baidubce.services.bos.model.ObjectMetadata;
import com.huixinpn.dionysus.meta.BOSMedia;
import com.huixinpn.dionysus.repository.BOSMediaRepository;
import com.huixinpn.dionysus.storage.StorageException;
import com.huixinpn.dionysus.storage.StorageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.UUID;
@Service("bcs")
public class BOSService implements StorageService {
private static final String binaryContentType = "application/octet-stream";
private BOSConfiguration configuration;
private BOSMediaRepository repository;
private BosClient bos;
private String bucket;
public BOSService() {
}
@PostConstruct
private void initialize() {
this.bucket = configuration.getBucket();
BosClientConfiguration config = new BosClientConfiguration();
config.setCredentials(new DefaultBceCredentials(configuration.getAccessKey(), configuration.getSecretKey()));
config.setEndpoint(configuration.getEndPoint());
bos = new BosClient(config);
}
public BOSService(BOSServiceBuilder builder) {
this.bucket = builder.getBucket();
BosClientConfiguration config = new BosClientConfiguration();
BceCredentials credential = new DefaultBceCredentials(builder.getAccessKey(),
builder.getSecretKey());
config.setCredentials(credential);
config.setEndpoint(builder.getEndPoint());
bos = new BosClient(config);
}
private void delete(String object) throws StorageException {
try {
bos.deleteObject(bucket, object);
repository.delete(repository.findByObject(object));
} catch (Exception t) {
throw new StorageException(
"failed to delete file from baidu cloud", t);
}
}
public String url(String object) {
GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(this.bucket, object);
return bos.generatePresignedUrl(urlRequest).toString();
}
public String getBucket() {
return this.bucket;
}
public BOSMediaRepository getRepository() {
return repository;
}
@Autowired
public void setRepository(BOSMediaRepository repository) {
this.repository = repository;
}
public BOSConfiguration getConfiguration() {
return configuration;
}
@Autowired
public void setConfiguration(BOSConfiguration configuration) {
this.configuration = configuration;
}
@Override
public String save(InputStream input) throws StorageException {
try {
int length = input.available();
String object = UUID.randomUUID().toString();
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(length);
metadata.setContentType(binaryContentType);
bos.putObject(bucket, object, input, metadata);
String url = this.url(object);
BOSMedia meta = new BOSMedia();
meta.setObject(object);
meta.setBucket(bucket);
meta.setMimetype(binaryContentType);
meta.setUrl(url);
meta.setSize(length);
repository.save(meta);
return object;
} catch (Exception e) {
throw new StorageException("store to baidu cloud failed", e);
}
}
@Override
public void remove(String name) throws StorageException {
delete(name);
}
@Override
public String save(byte[] data) throws StorageException {
InputStream stream = new ByteArrayInputStream(data);
return save(stream);
}
}