2017-01-03 3 views
0

У меня есть простая форма для загрузки файла, который позже будет обрабатываться с моим внутренним кодом python. Однако, что я получаю, когда пытаюсь загрузить файл, это C: \ fakepath \ test.txt.Загрузка файла с помощью responsejs и работа с C:/fakepath/file

Из исследования, которое я сделал, это ожидается и сделано из-за проблем с безопасностью. Это хорошо, но теперь мой вопрос в том, как в мире я могу обойти это, чтобы иметь возможность использовать файл, который я загружаю на своем back-end?

Я смотрел кучу разных мест, и никто из них, похоже, не обращается к этому.

Вот мой текущий код:

class SomeForm extends Component{ 

    handleFile(e){ 
     this.setState({value: e.target.value}); 
    } 

    handleSubmit(e){ 
     var me=this; 
     if (this.state.value.length>0){ 
      var upload_file = this.state.value; 
      const request = axios.post(this.props.cfg_url+'/upload', {upload_file}) 
       .then(function(response){ 
       console.log('successfully uploaded', upload_file); 
      }) 

     } 
    } 

    render(){ 
     return(


      <Form inline onSubmit={this.handleSubmit}> 
         <FormGroup controlId='uploadFormId'> 
          <ControlLabel>Upload File:</ControlLabel> 
          <FormControl 
           type='file' 
           label='File' 
           onChange={this.props.onChange} 
          /> 
         </FormGroup> 
         <Button type='submit'>Upload</Button> 
        </Form> 
     ); 

    } 
} 
+0

Зачем вам нужен путь? – epascarello

+0

@epascarello, потому что я должен делать некоторые манипуляции с файлами на стороне Python. Поэтому мне нужен путь, чтобы открывать, читать, писать. Если я этого не сделаю, в какой момент, пожалуйста, скажите мне, как – theJuls

+0

Но URL-адрес не имеет ничего общего с файлом, это не то, как вы получаете доступ к данным файла. Вы неправильно отправляете файл на сервер. См. Http://stackoverflow.com/questions/2320069/jquery-ajax-file-upload – epascarello

ответ

2

Я не понимаю, почему вы делаете var upload_file = this.state.value; если вы устанавливаете var upload_file = this.state.value;, но вы никогда не назначать value в государственном объекте (в приведенном ниже примере).

Я думаю, вы используете свойство value объекта input['file'] вместо files. Вы должны взять выбранный файл, используя свойство files, и использовать FormData interface для отображения параметров формы.

class SomeForm extends Component { 

    handleSubmit(e){ 
     if (e.target.input.files.length) { 
      const upload_file = e.target.input.files[0]; 
      const formData = new FormData(); 
      formData.append('file', upload_file); 

      const request = axios.post(this.props.cfg_url+'/upload', formData) 
       .then(function(response){ 
        console.log('successfully uploaded', upload_file); 
       }); 
     } else { 
      console.log('You need to select a file'); 
     } 
    } 

    render(){ 
     return(
      <Form inline onSubmit={this.handleSubmit}> 
       <FormGroup controlId='uploadFormId'> 
        <ControlLabel>Upload File:</ControlLabel> 
        <FormControl 
         type='file' 
         name="input-file" 
         label='File' 
        /> 
       </FormGroup> 
       <Button type='submit'>Upload</Button> 
      </Form> 
     ); 
    } 
} 

Live Example

Источник: https://github.com/mzabriskie/axios/tree/master/examples/upload

+0

Вещь в моей переменной upload_file была ошибкой, которую я сделал при переписывании моего кода здесь, поэтому у него не было бы сотен строк неуместных и вне контекста. Так жаль об этом! Виноват! Во всяком случае, мне пришлось проскользнуть через несколько обручей, чтобы они работали, но в целом эта часть теперь отлично справляется. Благодаря! – theJuls