.NET WinForms通过PictureBox上传图片至Cloudinary的问题处理
作为.NET/C#新手,我最近要做一个功能:用户点击PictureBox选择图片后,直接上传到Cloudinary。先写了下面这段代码:
public static Cloudinary cloudinary; public const string CLOUD_NAME = "XXXXXX"; public const string API_KEY = "XXXXXXX"; public const string API_SECRET = "XXXXXX"; string imagePath = ""; static void cloudinaryAccount(string[] args) { Account account = new Account(CLOUD_NAME, API_KEY, API_SECRET); cloudinary = new Cloudinary(account); } private void pictureBox1_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "All files(*.*)|*.*"; if (dialog.ShowDialog() == DialogResult.OK) { imagePath = dialog.FileName.ToString(); pictureBox1.ImageLocation = imagePath; } uploadImage(imagePath); // 将图片路径传入uploadImage()函数 } public static void uploadImage(string imagePath) { var UploadParams = new ImageUploadParams() { File = new FileDescription(imagePath) }; var uploadResult = cloudinary.Upload(UploadParams); }
第一个问题:cloudinary对象为空导致上传报错
执行到cloudinary.Upload(UploadParams)时直接抛出错误,排查后发现是cloudinary对象未被初始化。原来我写的cloudinaryAccount方法根本没被调用过,而且就算调用,这个带string[] args参数的静态方法,在WinForm场景下也不会自动执行。
一开始我把Account的初始化代码移到uploadImage函数里,虽然解决了对象为空的问题,但又遇到了新错误。
第二个问题:Newtonsoft.Json程序集找不到
错误提示:
System.IO.FileNotFoundException: 'Could not load file or assembly 'Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The system cannot find the file specified.'
这是因为Cloudinary的.NET SDK依赖特定版本的Newtonsoft.Json,项目里要么没装这个包,要么版本不匹配。解决方法:
- 打开NuGet包管理器,搜索
Newtonsoft.Json,安装12.0.0版本(或SDK要求的对应版本); - 如果已经装了其他版本,先卸载再重新安装指定版本;
- 确认项目引用里能看到Newtonsoft.Json且版本正确。
更合理的初始化方式
其实不用把初始化代码塞到uploadImage里,更好的做法是在窗体构造函数或者Load事件里初始化Cloudinary对象,保证整个应用生命周期内对象都可用:
public YourFormName() { InitializeComponent(); // 初始化Cloudinary Account account = new Account(CLOUD_NAME, API_KEY, API_SECRET); cloudinary = new Cloudinary(account); }
现在功能已经正常运行啦!
内容的提问来源于stack exchange,提问作者Jelmer Overeem

