我具有以下功能,该功能允许用户使用相机拍摄照片,或从画廊中选择照片,然后裁剪图像,然后需要使用POST和multipart / form-data将其上传到服务器 我已经使用了大量的上传方法,但是似乎都不起作用。
Extract<T[number], {name: {0: K} }>
我将文件放在类似file:/// var / mobile / Containers / Data / Application / 1FF313F5-5736-44D0-968D- 37889E3ED537 / Library / NoCloud / 1536106729187.jpg或/ var / mobile /的路径中。 ../ tmp / something.jpg
我尝试用以下方式上传它们:
public async takePicture(sourceType) {
// Create options for the Camera Dialog
const options = {
quality: 100,
sourceType: sourceType,
saveToPhotoAlbum: false,
correctOrientation: true,
};
try {
// Get the data of an image
const imagePath = await this.camera.getPicture(options);
// Special handling for Android library
let uploadedImage;
if (this.platform.is("android") && sourceType === this.camera.PictureSourceType.PHOTOLIBRARY) {
const filePath = await this.filePath.resolveNativePath(imagePath);
const correctPath = filePath.substr(0, filePath.lastIndexOf("/") + 1);
const currentName = imagePath.substring(imagePath.lastIndexOf("/") + 1, imagePath.lastIndexOf("?"));
uploadedImage = await this.copyFileToLocalDir(correctPath, currentName, this.createFileName());
} else {
const currentName = imagePath.substr(imagePath.lastIndexOf("/") + 1);
const correctPath = imagePath.substr(0, imagePath.lastIndexOf("/") + 1);
uploadedImage = await this.copyFileToLocalDir(correctPath, currentName, this.createFileName());
}
console.log('PATH', cordova.file.dataDirectory + uploadedImage);
this.crop.crop(cordova.file.dataDirectory + uploadedImage, {quality: 75}).then(
newImage => {
this.uploadedImage = newImage.replace("file://", "");
// UPLOAD HERE
},
error => {
this.presentToast("Error while selecting image.");
}
);
} catch (err) {
this.presentToast("Error while selecting image.");
}
}
public async copyFileToLocalDir(namePath, currentName, newFileName): Promise<string> {
const externalStoragePath: string = cordova.file.dataDirectory;
try {
const entry = await this.file.resolveLocalFilesystemUrl(namePath + currentName);
const dirEntry: any = await this.file.resolveLocalFilesystemUrl(externalStoragePath);
entry.copyTo(dirEntry, newFileName, () => { }, () => {
this.presentToast("Error while storing file.");
});
return newFileName;
} catch (error) {
this.presentToast("Error while storing file.");
}
}
但是formData需要一个blob,而不是一个路径,因此这不起作用。我可以使用该路径进行上传,还是将其转换为Blob?
谢谢
答案 0 :(得分:0)
Cordova建议使用https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file-transfer/将文件从手机传输到服务器。这是由于跨平台支持和一些调整才能使事情正常进行。
您会看到“ FileUploadOptions”,其中将文件路径(设备上的本地路径)放入选项中。
示例:
// !! Assumes variable uploadedImage contains a valid URL to a text file on the device,
// for example, cdvfile://localhost/persistent/path/to/file.txt
var options = new FileUploadOptions();
options.fileKey = "file";
options.fileName = uploadedImage.substr(uploadedImage.lastIndexOf('/') + 1);
options.mimeType = "text/plain";
var ft = new FileTransfer();
ft.upload(uploadedImage, encodeURI("http://some.server.com/upload.php"), SUCCESS_FUNCTION, ERROR_FUNCTION, options)