flutter 图片上传到oss,直接cv就可以使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flutter 图片上传到oss,直接cv就可以使用相关的知识,希望对你有一定的参考价值。
参考技术A用到了一个插件: image_picker ,但是在使用这个插件过程中发现部分安卓手机拍照会奔溃(PlatformException (PlatformException(already_active, Image picker is already active, null, null))),就是运行官方的demo也是一样会报错,版本: 0.8.4+3 ,查了很多资料也没解决,也都尝试了。我们的需求只是拍照上传图片,你可以根据你的需求使用image_picker,他可以选择视频,照片等
OSS上传文件到阿里云
最近做项目,需要上传文件,因为上传到项目路径下,感觉有时候也挺不方便的,就试了一下上传文件到阿里云oss上去了,
oss的使用网上有很多介绍,都是去配置一下需要的数据,然后直接调用他的api就可以了。
这里贴一段可以直接使用的oss代码,有需要的可以自己参考下。
@Controller @RequestMapping("/ossfile") public class OSSFileController { @Autowired private EventidService eventidService; //----------------------------------------------------------------------------------------------- private final static String OSS_PATH = ""; /** * 阿里云ACCESS_ID */ private static String ACCESS_ID = ""; /** * 阿里云ACCESS_KEY */ private static String ACCESS_KEY = ""; /** * 阿里云OSS_ENDPOINT 青岛Url */ private static String OSS_ENDPOINT = ""; /** * 阿里云BUCKET_NAME OSS */ private static String BUCKET_NAME = ""; @RequestMapping("/uploadfile") public String uploadfile(@RequestParam("file") MultipartFile file, @RequestParam("eventId") int eventId, HttpSession session) throws FileNotFoundException { ErrorResult result = new ErrorResult(); //先提前设置下oss的部分 OSSClient client = new OSSClient(OSS_ENDPOINT, ACCESS_ID, ACCESS_KEY); OSSNewUtils.ensureBucket(client, BUCKET_NAME); OSSNewUtils.setBucketPublicReadable(client, BUCKET_NAME); String Objectkey = file.getOriginalFilename(); String filename = file.getOriginalFilename(); System.out.println("文件名字"+file.getName()); //这里给提交过来的文件设置一个本地路径, // 然后提交过来的文件先存入该路径, // 然后再从该路径提交到阿里云服务器 // 得到uploadFile的绝对路径 String realPath = session.getServletContext().getRealPath("uploadFile"); // 将文件放在这个路径下 File filedir = new File(realPath,file.getOriginalFilename()); // 创建uploadFile目录 filedir.getParentFile().mkdir(); /*这里要写提交的文件地址,也就是已经下载到本地的本地文件地址*/ String uploadFilePath = filedir.toString(); //创建本地文件夹后,先将文件存入本地文件夹 try { // 将上传的文件写入到本地中 file.transferTo(filedir); session.setAttribute("imgPath", file.getOriginalFilename()); System.out.println("文件上传到本地文件夹完成,本地文件夹地址:"+ filedir.toString()/*uploadFilePath*/); } catch (Exception e) { e.printStackTrace(); System.err.println("文件上传到本地文件夹失败 "); session.setAttribute("errMsg", e.toString()); } System.out.println("开始上传到阿里云服务器."); System.out.println("正在上传..."); OSSNewUtils.uploadFile(client, BUCKET_NAME, Objectkey, uploadFilePath); System.out.println("上传文件到阿里云成功"); //从阿里云服务器下载文件的存储地址 //String downloadFilePath = "C:\ccc\"; //System.out.println("正在下载..."); //downloadFile(client, BUCKET_NAME, Objectkey, downloadFilePath); //发送文件请求,也需要携带你的eventid事件的id,才能存取地址到相应的eventid中去 Eventid eventid = new Eventid(); eventid = eventidService.selectByPrimaryKey(eventId); //设置数据库地址 eventid.setEventMediafile(OSS_PATH+"/"+Objectkey); //将阿里云上的地址保存到数据库中去 int resul = eventidService.updateByPrimaryKey(eventid); System.out.println("更新数据库文件地址字段成功!"); result.setStatus(200); result.setError("成功的上传文件到阿里云"); result.setData(file); return "uploadsuccess"; } }
还有一段使用到的oss工具类封装好了,直接使用吧。
public class OSSNewUtils { /** * 创建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); }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 */ public 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 */ public 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 * @throws FileNotFoundException */ public static RespInfo uploadFile(OSSClient client, String bucketName, String Objectkey, String filename) throws OSSException, ClientException, FileNotFoundException { RespInfo respInfo = new RespInfo(); File file = new File(filename); ObjectMetadata objectMeta = new ObjectMetadata(); 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); client.putObject(bucketName, Objectkey, input, objectMeta); respInfo.setContent(filename); return respInfo; } /** * 下载文件 * * @param client OSSClient对象 * @param bucketName Bucket名 * @param Objectkey 上传到OSS起的名 * @param filename 文件下载到本地保存的路径 * @throws OSSException * @throws ClientException */ public static void downloadFile(OSSClient client, String bucketName, String Objectkey, String filename) throws OSSException, ClientException { client.getObject(new GetObjectRequest(bucketName, Objectkey), new File(filename)); } }
oss还有很多功能可以使用,过几天自己再试用一下其他的功能。
以上是关于flutter 图片上传到oss,直接cv就可以使用的主要内容,如果未能解决你的问题,请参考以下文章