HarmonyOS 鸿蒙Next如何上传本地图片
HarmonyOS 鸿蒙Next如何上传本地图片
期待结果:
希望能够正常上传本地图片,接口可以访问通过
let formData = new FormData()
formData.append(‘file’, ‘file://media/Photo/3/***.jpgt’);
// 发送请求
axios.post<string, AxiosResponse<string>, FormData>(‘http//*****’ formData, {
// headers: { ‘Content-Type’: ‘multipart/form-data’ },
context: getContext(this),
onUploadProgress: (progressEvent: AxiosProgressEvent): void => {
},
}).then((res: AxiosResponse<string>) => {
}).catch((err: AxiosError) => {
})
axios上传类型支持uri和ArrayBuffer ,下面demo中value是拿到的URI,
header请求头也设置一下,放开注释
// 转化为internal://cache
fs.open(value, fs.OpenMode.READ_ONLY).then((file) => { // READ_ONLY READ_WRITE
let newPath = this.context.cacheDir + /test.png
;
fs.copyFile(file.fd, newPath).then(() => {
console.info(<span class="hljs-string">"applog:copy file succeed"</span>);
<span class="hljs-keyword">let</span> realUri = <span class="hljs-string">"internal://cache/"</span>+newPath.split(<span class="hljs-string">"cache/"</span>)[<span class="hljs-number">1</span>];
console.log(<span class="hljs-string">'realUri'</span>+<span class="hljs-built_in">JSON</span>.stringify(realUri))
}).catch((err:BusinessError) => {
console.info(<span class="hljs-string">"applog:copy file failed with error message: "</span> + err.message + <span class="hljs-string">", error code: "</span> + err.code);
});
}).catch((err:BusinessError) => {
console.info("applog:open file failed with error message: " + err.message + ", error code: " + err.code);
})
// 转化为Arraybuffer
let file = fs.openSync(value, fs.OpenMode.READ_ONLY)
const imageSource = image.createImageSource(file.fd);
fs.closeSync(file)
const imagePackApi = image.createImagePacker()
let packOpts: image.PackingOption = { format: “image/png”, quality: 100 }
imagePackApi.packing(imageSource, packOpts)
.then(readBuffer => {
<span class="hljs-keyword">let</span> bufferArr = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Uint8Array</span>(readBuffer);
<span class="hljs-keyword">let</span> help =<span class="hljs-keyword">new</span> util.Base64Helper()
<span class="hljs-keyword">let</span> base64 = help.encodeToStringSync(bufferArr)
console.log(<span class="hljs-string">'base64'</span>+<span class="hljs-built_in">JSON</span>.stringify(base64))
console.log(<span class="hljs-string">'bufferArr'</span>+<span class="hljs-built_in">JSON</span>.stringify(bufferArr))
}).catch((err:BusinessError) => {
console.error('PhotoViewPicker.select failed with err: ’ + err);
})
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
直接上传文件的 ArrayBuffer
function uploadFile(url: string) {
let formData = new FormData()
// 读取文件的arrayBuffer 内容
let file = fs.openSync(url, fs.OpenMode.READ_ONLY);
let stat = fs.lstatSync(url);
let fileBuffer = new ArrayBuffer(stat.size);
fs.readSync(file.fd, fileBuffer); // Read data from the stream file in synchronous mode.
fs.fsyncSync(file.fd);
fs.closeSync(file.fd);
formData.append(‘file’, fileBuffer);
// …
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
可以试一下以上的demo.
在HarmonyOS鸿蒙Next中上传本地图片,可以按照以下步骤进行:
- 选择图片:使用
@ohos.file.picker
模块的图库选择器(PhotoViewPicker
)来选择图片。在选择之前,可以设置选择数量、资源类型等参数。 - 拷贝图片:由于上传应用文件功能不支持直接上传本地相册的文件,仅支持上传应用缓存文件路径(
cacheDir
)下的文件,因此需要先将选中的图片拷贝到应用的缓存目录中。 - 上传图片:使用
@ohos.request
模块提供的request.uploadFile
方法将图片上传到服务器。在上传之前,需要准备好参数,包括上传地址、请求方法、请求头、文件信息等。 - 处理响应:上传完成后,服务器会返回响应。可以通过监听
progress
事件来跟踪上传进度,并在上传完成后解析服务器返回的响应数据。
如果在操作过程中遇到问题,建议查阅HarmonyOS官方文档或相关开发社区。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。