代码之家  ›  专栏  ›  技术社区  ›  Scobee

Angular 5将裁剪后的文件上载到PHP后端

  •  0
  • Scobee  · 技术社区  · 6 年前

    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.");
        }
    }
    

    我把文件放在一个类似文件的路径中:///var/mobile/Containers/Data/Application/1FF313F5-5736-44D0-968D-37889E3ED537/Library/NoCloud/1536106729187.jpg或/var/mobile/../tmp/某物.jpg

    我试着用以下方式上传:

    const options = {} as any; // Set any options you like
    const formData = new FormData();
    
    // Append files to the virtual form.
    const file = new File();
    formData.append("fsFile", this.uploadedImage, "yes");
    
    // Send it.
    this.httpClient.post("/files/upload_tmp", formData, options)
                        .toPromise()
                        .catch((e) => {
                            console.log(e);
                        });
    

    谢谢你

    1 回复  |  直到 6 年前
        1
  •  0
  •   Develobba    6 年前

    科尔多瓦建议使用 https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file-transfer/ 用于将文件从手机传送到服务器。这是由于跨平台的支持和一些使事情正常工作的调整。

    例子:

    // !! 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)