Java上传图片到OSS

来源:互联网 发布:java 实现syslog 编辑:程序博客网 时间:2024/05/18 03:14

上传主方法


package cn.osworks.aos.huijia.modules.utils;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSErrorCode;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.ServiceException;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;


public class UploadFile {
/**
* 阿里云ACCESS_ID
*/
// ID:aQFi66LcWwC8TbWP
// KEY:UIahtOgRNT4nPpykOorrDsl3K22Pas


private static String ACCESS_ID = "LTAIxXgQ6Zj1pwb7";
/**
* 阿里云ACCESS_KEY
*/
private static String ACCESS_KEY = "3bV63KYqCBpoXjiFIjAImIW3Venv7l";
/**
* 阿里云OSS_ENDPOINT 青岛Url
*/
private static String OSS_ENDPOINT = "http://oss-cn-beijing.aliyuncs.com";


/**
* 阿里云BUCKET_NAME OSS
*/
private static String BUCKET_NAME = "huijw";

public static String BTY(String Objectkey,String uploadFilePath){
OSSClient client = new OSSClient(OSS_ENDPOINT, ACCESS_ID, ACCESS_KEY);
try {
ensureBucket(client, BUCKET_NAME);
setBucketPublicReadable(client, BUCKET_NAME);


System.out.println("正在上传...");
uploadFile(client, BUCKET_NAME, Objectkey, uploadFilePath);

// client.deleteObject(BUCKET_NAME, Objectkey);
// deleteBucket(client, Objectkey);
// System.out.println("正在下载...");
// downloadFile(client, BUCKET_NAME, Objectkey, downloadFilePath);
} catch (Exception e) {
e.printStackTrace();
} finally {

}
return Objectkey;
}



public static void main(String[] args) {
// String bucketName = "demo10";
String Objectkey = "head/banner-4.png";


String uploadFilePath = "D:/banner-4.png";
// String downloadFilePath = "/Users/liaomc/Desktop/hs2.jpg";


// 如果你想配置OSSClient的一些细节的参数,可以在构造OSSClient的时候传入ClientConfiguration对象。
// ClientConfiguration是OSS服务的配置类,可以为客户端配置代理,最大连接数等参数。
// 具体配置看http://aliyun_portal_storage.oss.aliyuncs.com/oss_api/oss_javahtml/OSSClient.html#id2
// ClientConfiguration conf = new ClientConfiguration();
// OSSClient client = new OSSClient(OSS_ENDPOINT, ACCESS_ID, ACCESS_KEY,
// conf);
// 创建ClientConfiguration实例


// 使用默认的OSS服务器地址创建OSSClient对象,不叫OSS_ENDPOINT代表使用杭州节点,青岛节点要加上不然包异常
OSSClient client = new OSSClient(OSS_ENDPOINT, ACCESS_ID, ACCESS_KEY);
try {
ensureBucket(client, BUCKET_NAME);
setBucketPublicReadable(client, BUCKET_NAME);


System.out.println("正在上传...");
uploadFile(client, BUCKET_NAME, Objectkey, uploadFilePath);


// client.deleteObject(BUCKET_NAME, Objectkey);
// deleteBucket(client, Objectkey);
// System.out.println("正在下载...");
// downloadFile(client, BUCKET_NAME, Objectkey, downloadFilePath);
} catch (Exception e) {
e.printStackTrace();
} finally {

}
}
/**
* 上传文件

* @param client
*            OSSClient对象
* @param bucketName
*            Bucket名
* @param Objectkey
*            上传到OSS起的名
* @param filename
*            本地文件名
* @throws OSSException
* @throws ClientException
* @throws FileNotFoundException
*/
private static void uploadFile(OSSClient client, String bucketName,
String Objectkey, String filename) throws OSSException,
ClientException, FileNotFoundException {
File file = new File(filename);
ObjectMetadata objectMeta = new ObjectMetadata();
//String md5 = objectMeta.getContentMD5();
//System.out.println(md5);
objectMeta.setContentLength(file.length());
// 判断上传类型,多的可根据自己需求来判定
if (filename.endsWith("xml")) {
objectMeta.setContentType("text/xml");
} else if (filename.endsWith("jpg")) {
objectMeta.setContentType("image/jpeg");
} else if (filename.endsWith("png")) {
objectMeta.setContentType("image/png");
}


InputStream input = new FileInputStream(file);
PutObjectResult result = client.putObject(bucketName, Objectkey, input,
objectMeta);
// 打印ETag
System.out.println(result.getETag());
//if (md5.equals(result.getETag()))
System.out.println("上传完成");
}


/**
* 创建Bucket

* @param client
*            OSSClient对象
* @param bucketName
*            BUCKET名
* @throws OSSException
* @throws ClientException
*/
public static void ensureBucket(OSSClient client, String bucketName)
throws OSSException, ClientException {
try {
client.createBucket(bucketName);
client.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
} catch (ServiceException e) {
if (!OSSErrorCode.BUCKET_ALREADY_EXISTS.equals(e.getErrorCode())) {
throw e;
}
}
}


/**
* 删除一个Bucket和其中的Objects

* @param client
*            OSSClient对象
* @param bucketName
*            Bucket名
* @throws OSSException
* @throws ClientException
*/
private static void deleteBucket(OSSClient client, String bucketName)
throws OSSException, ClientException {
ObjectListing ObjectListing = client.listObjects(bucketName);
List<OSSObjectSummary> listDeletes = ObjectListing.getObjectSummaries();
for (int i = 0; i < listDeletes.size(); i++) {
String objectName = listDeletes.get(i).getKey();
System.out.println("objectName = " + objectName);
// 如果不为空,先删除bucket下的文件
client.deleteObject(bucketName, objectName);
}
client.deleteBucket(bucketName);
}


/**
* 把Bucket设置成所有人可读

* @param client
*            OSSClient对象
* @param bucketName
*            Bucket名
* @throws OSSException
* @throws ClientException
*/
private static void setBucketPublicReadable(OSSClient client,
String bucketName) throws OSSException, ClientException {
// 创建bucket
client.createBucket(bucketName);


// 设置bucket的访问权限, public-read-write权限
client.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
}




/**
* 下载文件

* @param client
*            OSSClient对象
* @param bucketName
*            Bucket名
* @param Objectkey
*            上传到OSS起的名
* @param filename
*            文件下载到本地保存的路径
* @throws OSSException
* @throws ClientException
*/
private static void downloadFile(OSSClient client, String bucketName,
String Objectkey, String filename) throws OSSException,
ClientException {
client.getObject(new GetObjectRequest(bucketName, Objectkey), new File(
filename));
}

}

前端调用


---------------引入libjar包
《-----------------前端-------------》


<aos:window id="_w_deploy" title="上传图片">
<aos:formpanel id="_f_deploy" width="450" layout="column" labelWidth="70">
<aos:filefield name="pic_file" fieldLabel="图片" buttonText="选择图片" allowBlank="false" columnWidth="0.99"
emptyText="请选择图片文件..." />
</aos:formpanel>
<aos:docked dock="bottom" ui="footer">
<aos:dockeditem xtype="tbfill" />
<aos:dockeditem onclick="_f_deploy_save" text="上传" icon="ok.png" />
<aos:dockeditem onclick="#_w_deploy.hide();" text="关闭" icon="close.png" />
</aos:docked>
</aos:window>




//部署(注:文件上传操作不能使用AOS.Ajax()方法,只能使用Form自带的submit()函数)。
  function _f_deploy_save() {
      var form = _f_deploy.getForm();
      if (!form.isValid()) {
  return;
      }
      AOS.wait();
      form.submit({
  url: 'uploadPic.jhtml',
  success: function (form, action) {
      //_w_deploy.hide();
      AOS.
      AOS.hide();
     // AOS.tip();
      AOS.tip("上传完成");
      _g_proc_query();
  }
      });
  }




《-----------------上传图片action-------------》
/**
* 上传图片
* @param session
* @param request
* @return
* @throws IOException 
*/
@RequestMapping(value = "uploadPic")
public void uploadPic(
@RequestParam("pic_file") MultipartFile pic_file ,
HttpServletRequest request,HttpServletResponse response) throws IOException {


/*HttpServletRequest request= httpModel.getRequest();
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;  
MultipartFile myFile = multipartRequest.getFile("myFile"); */
Dto inDto = Dtos.newDto(request);
inDto.put("pic_file", pic_file);

Dto outDto = tbadvertservice.uploadPic(inDto,request);
WebCxt.write(response, AOSJson.toJson(outDto));
}
《-----------------上传图片service-------------》
/**
* 上传图片
* @param inDto
* @param request2 
* @return
* @throws IOException 
*/
public Dto uploadPic(Dto inDto, HttpServletRequest request) throws IOException {

Dto outDto = Dtos.newOutDto();


MultipartFile picFile= (MultipartFile) inDto.get("pic_file");
//判断图片格式
if (StringUtils.indexOf(picFile.getOriginalFilename(), ".jpg") == -1) {
outDto.setAppMsg("操作被取消,只能上传.jpg格式的图片。");
return outDto;
}
//图片存储到本地服务器
String path=request.getSession().getServletContext().getRealPath("/upload/");
//取后缀
   String suffix = picFile.getOriginalFilename().substring(picFile.getOriginalFilename().lastIndexOf("."));
   //存储到本地的图片名称
   String fileName =picFile.getOriginalFilename(); 
   
   //本地目的地址
   String destDir=path+"/"+fileName;
   File f=new File(path,fileName);
   picFile.transferTo(f);
            //"advert"+"/"   服务器路径
   String upImageToOSS = upImageToOSS("advert"+"/"+fileName, destDir);
System.out.println(upImageToOSS);


outDto.setAppMsg("上传图片成功。");

outDto.setStringA(upImageToOSS);
return outDto;
}


-------- 在需要调用的service里面定义如下方法
/**
* 图片上传本OSS
Objectkey:服务器路径
uploadFilePath:本地路径
*/
public String  upImageToOSS(String Objectkey,String uploadFilePath) {
/*String Objectkey = "head/f.jpg";


String uploadFilePath = "D:/w.jpg";*/
String bty = UploadFile.BTY(Objectkey, uploadFilePath);
return bty;
}


------------------调用UploadFile.java