电子:获取上传文件的完整路径

时间:2016-07-22 15:29:55

标签: node.js electron

我现在使用Electron构建GUI。 (如桌面应用的PhoneGap)

有没有办法在<input type="file">中启用文件的完整路径?
现在是C:\fakepath\dataset.zip的。 (目录名称不是&#39; t&#34;伪路径&#34;,但这是document.getElementById("myFile").value的值)

或者,还有其他方法可以选择文件吗?

5 个答案:

答案 0 :(得分:22)

Electron向path个对象添加File属性,因此您可以使用以下命令从输入元素获取实际路径:

document.getElementById("myFile").files[0].path

答案 1 :(得分:0)

根据这个答案How to get full path of selected file on change of <input type=‘file’> using javascript, jquery-ajax?,出于安全考虑,无法按照您的要求进行操作。

然而,你可以像我在我工作的电子项目中那样做一些工作。

  1. 创建HTML按钮
  2. 然后在渲染器进程中为您之前创建的按钮创建一个事件侦听器。

    const ipc = require('electron').ipcRenderer;
    const buttonCreated = document.getElementById('button-created-id');
    
    buttonCreated.addEventListener('click', function (event) {
        ipc.send('open-file-dialog-for-file')
    });
    
  3. 然后在主要流程中,使用showOpenDialog选择文件,然后将full path发送回渲染器流程。

    ipc.on('open-file-dialog-for-file', function (event) {
     if(os.platform() === 'linux' || os.platform() === 'win32'){
        dialog.showOpenDialog({
            properties: ['openFile']
        }, function (files) {
           if (files) event.sender.send('selected-file', files[0]);
        });
    } else {
        dialog.showOpenDialog({
            properties: ['openFile', 'openDirectory']
        }, function (files) {
            if (files) event.sender.send('selected-file', files[0]);
        });
    }});
    
  4. 然后在渲染器流程中,您获得了full path

    ipc.on('selected-file', function (event, path) {
        console.log('Full path: ', path);
    });
    
  5. 因此,您可以使用与输入类型文件类似的行为并获取完整路径。

答案 2 :(得分:0)

<script>

    const electron = require('electron');
    const { ipcRenderer } = electron;
    const ko = require('knockout')
    const fs = require('fs');
    const request = require('request-promise');

    // replace with your own paths
    var zipFilePath = 'C:/Users/malco/AppData/Roaming/Wimpsdata/Wimpsdata.zip';
    var uploadUri = 'http://localhost:59887/api/Collector/Upload'

    var request = require('request');
    request.post({
        headers: { 'content-type': 'application/zip' },
        url: uploadUri,
        body: fs.createReadStream(zipFilePath)
    }, function (error, response, body) {
        console.log(body);
        location.href = 'ScanResults.html';
    });
</script>

ASP .NET WebAPI Conontroller

using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using Wimps.Services.Business;

namespace Wimps.Services.Controllers
{
    public class CollectorController : ApiController
    {

        public async Task<bool> Upload()
        {
            try
            {
                var fileuploadPath = ConfigurationManager.AppSettings["FileUploadLocation"];

                var provider = new MultipartFormDataStreamProvider(fileuploadPath);
                var content = new StreamContent(HttpContext.Current.Request.GetBufferlessInputStream(true));
                foreach (var header in Request.Content.Headers)
                {
                    content.Headers.TryAddWithoutValidation(header.Key, header.Value);
                }

                Byte[] byteArray = await content.ReadAsByteArrayAsync();

                string newFileName = Guid.NewGuid().ToString();
                string newFilePath = fileuploadPath + "\\" + newFileName + ".zip";
                if (File.Exists(newFilePath))
                {
                    File.Delete(newFilePath);
                }

                File.WriteAllBytes(newFilePath, byteArray);

                string unzipTo = fileuploadPath + "\\" + newFileName;
                Directory.CreateDirectory(unzipTo);

                DirectoryInfo di = new DirectoryInfo(unzipTo);
                foreach (FileInfo file in di.GetFiles())
                {
                    file.Delete();
                }

                ZipFile.ExtractToDirectory(newFilePath, unzipTo);



                return true;
            }
            catch (Exception e)
            {
                // handle exception here
                return false;
            }
        }
    }
}

需要将密钥添加到Web配置中以上传文件

<configuration>
  <appSettings>
... other keys here
    <add key="FileUploadLocation" value="C:\Temp\Uploads" />
  </appSettings>

其余的应用程序配置 ... ...

答案 3 :(得分:0)

接受的答案对于原始问题非常有用,但是@ Piero-Divasto的答案对我而言要好得多。

我需要的是目录的路径名,该路径名可能很大。使用接受的答案,这可以在处理目录内容的同时将主进程阻塞几秒钟。使用dialog.showOpenDialog(...)可以使我得到即时的响应。唯一的区别是dialog.showOpenDialog不再使用回调函数,而是返回一个promise:

ipcMain.on("open-file-dialog-for-dir", async event => {
  const dir = await dialog.showOpenDialog({ properties: ["openDirectory"] });
  if (dir) {
    event.sender.send("selected-dir", dir.filePaths[0]);
  }
});

答案 4 :(得分:-1)

<script>const electron = require('electron');</script>
<button id="myFile" onclick="this.value=electron.remote.dialog.showOpenDialog()[0]">UpdateFile</button>

现在,document.getElementById("myFile").value将包含所选文件的完整路径。