使用vue.js跟踪文件上传

时间:2018-08-15 17:14:30

标签: laravel vue.js

当前正在构建一个允许用户上传视频的Web应用程序,现在我有一个表单,可以使用laravel发布所有用户详细信息和视频,现在我想使用进度条跟踪文件上传。 ..i发现vue.js可以解决这个问题。

这是我的UploadController.php

function generateRandomString($length = 10) {
    return strtoupper(substr(str_shuffle("123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ"), 0, $length));
}


public function store(Request $request){
    $validatedData = $request->validate([
        'name'=>'required | unique:uploads',
        'email'=>'required | email | unique:uploads',
        'phone'=>'required',
        'country'=>'required',
        'title'=>'required | unique:uploads',
        'agency'=>'required',
        'category'=>'required',
        'video'=>'required | file | mimetypes:video/mp4,video/webm | max:40960'
    ],[

        'name.required' => 'Name is required',

        'ref.required' => 'Reference is required',

    ]);
    // Unique ID
    $ref = $this->generateRandomString();


    $email = $request->email;

    // Get Filename with extention
    $filenameWithExtension = $request->file('video')->getClientOriginalName();

    //Get just the filename
    $filename = pathinfo($filenameWithExtension, PATHINFO_FILENAME);

    //Get just the extention
    $extension = $request->file('video')->getClientOriginalExtension();

    //Get new filename
    $filenameToStore = $ref.'.'.$extension;

    // Upload Video
    $path = $request->file('video')->storeAs('public/videos', $filenameToStore);

    //Create new registration
    $upload = new Upload;
    $upload->name = $request->input('name');
    $upload->email = $request->input('email');
    $upload->phone = $request->input('phone');   
    $upload->country = $request->input('country');    
    $upload->title = $request->input('title');
    $upload->agency = $request->input('agency');
    $upload->ref = $ref;
    $upload->category = $request->input('category');
    $upload->video = $filenameToStore;
    $upload->save();


    Mail::send('emails.welcome',[
        'ref' => $ref,
        'name' => $request->name,
        'title'=> $request->title,
        'category'=> $request->category,
        'agency'=> $request->agency,
        'phone'=> $request->phone,
        'country'=> $request->country,

    ], function ($mail) use($request){

        $mail->from('no-reply@percussionfed.org', 'International Percussion Federation');
        $mail->to($request->email)->subject('International Percussion Federation');

    });



    return redirect('/register')->with('success', 'Registration Successful, Check'." ".$email." ".'for details.' );

}

View.blade.php

<form method="POST" action="/store" enctype="multipart/form-data">
                @csrf
                <div class="row">   
                    <div class="col-md-6">
                        <div class="form-group">
                            <label>Name</label>
                            <sup class="required" title="Required">*</sup>
                            <input type="text" class="file" title="Name" value="{{old('name')}}" name="name" >
                        </div>
                    </div>
                    <div class="col-md-6">
                    <div class="form-group">
                        <label>Email</label>
                        <sup class="required" title="Required">*</sup>
                        <input type="text" class="file" title="Email" value="{{old('email')}}" name="email" >
                    </div>  
                    </div>
                    <div class="col-md-6">
                        <div class="form-group">
                            <label>Phone</label>
                            <sup class="required" title="Required">*</sup>
                            <input type="number" class="file" title="Phone" value="{{old('phone')}}" name="phone" >
                        </div>
                    </div>
                    <div class="col-md-6">
                    <div class="form-group">
                        <label>Country</label>
                        <sup class="required" title="Required">*</sup>
                        <select class="file" title="Country" id="country" value="{{old('country')}}" name="country" >
                                <option value="">Select your country</option>
                                <option value="United States">United States</option>
                                <option value="Afghanistan">Afghanistan</option>
                                <option value="Albania">Albania</option>
                                <option value="Algeria">Algeria</option>
                                <option value="Andorra">Andorra</option>
                                <option value="Angola">Angola</option>
                                <option value="Anguilla">Anguilla</option>
                                <option value="Antarctica">Antarctica</option>
                                <option value="Antigua and Barbuda">Antigua and Barbuda</option>
                                <option value="Argentina">Argentina</option>
                                <option value="Armenia">Armenia</option>
                                <option value="Aruba">Aruba</option>
                                <option value="Australia">Australia</option>
                                <option value="Austria">Austria</option>
                                <option value="Azerbaidjan">Azerbaidjan</option>
                                <option value="Bahamas">Bahamas</option>
                                <option value="Bahrain">Bahrain</option>
                                <option value="Bangladesh">Bangladesh</option>
                                <option value="Barbados">Barbados</option>
                                <option value="Belarus">Belarus</option>
                                <option value="Belgium">Belgium</option>
                                <option value="Belize">Belize</option>
                                <option value="Benin">Benin</option>
                                <option value="Bermuda">Bermuda</option>
                                <option value="Bhutan">Bhutan</option>
                                <option value="Bolivia">Bolivia</option>
                                <option value="Bosnia-Herzegovina">Bosnia-Herzegovina</option>
                                <option value="Botswana">Botswana</option>
                                <option value="Bouvet Island">Bouvet Island</option>
                                <option value="Brazil">Brazil</option>
                                <option value="British Indian Ocean Territory">British Indian Ocean Territory</option>
                                <option value="Brunei Darussalam">Brunei Darussalam</option>
                                <option value="Bulgaria">Bulgaria</option>
                                <option value="Burkina Faso">Burkina Faso</option>
                                <option value="Burundi">Burundi</option>
                                <option value="Cambodia">Cambodia</option>
                                <option value="Cameroon">Cameroon</option>
                                <option value="Canada">Canada</option>
                                <option value="Cape Verde">Cape Verde</option>
                                <option value="Cayman Islands">Cayman Islands</option>
                                <option value="Central African Republic">Central African Republic</option>
                                <option value="Chad">Chad</option>
                                <option value="Chile">Chile</option>
                                <option value="China">China</option>
                                <option value="Christmas Island">Christmas Island</option>
                                <option value="Cocos Islands">Cocos Islands</option>
                                <option value="Colombia">Colombia</option>
                                <option value="Comoros">Comoros</option>
                                <option value="Congo">Congo</option>
                                <option value="Congo, Democratic Republic">Congo, Democratic Republic</option>
                                <option value="Cook Islands">Cook Islands</option>
                                <option value="Costa Rica">Costa Rica</option>
                                <option value="Cote D'Ivoire">Cote D'Ivoire</option>
                                <option value="Croatia">Croatia</option>
                                <option value="Cuba">Cuba</option>
                                <option value="Curacao">Curacao</option>
                                <option value="Cyprus">Cyprus</option>
                                <option value="Czech Republic">Czech Republic</option>
                                <option value="Denmark">Denmark</option>
                                <option value="Djibuti">Djibuti</option>
                                <option value="Dominica">Dominica</option>
                                <option value="Dominican Republic">Dominican Republic</option>
                                <option value="Ecuador">Ecuador</option>
                                <option value="Egypt">Egypt</option>
                                <option value="El Salvador">El Salvador</option>
                                <option value="Equatorial Guinea">Equatorial Guinea</option>
                                <option value="Eritrea">Eritrea</option>
                                <option value="Estonia">Estonia</option>
                                <option value="Ethiopia">Ethiopia</option>
                                <option value="Falkland Islands">Falkland Islands</option>
                                <option value="Faroe Islands">Faroe Islands</option>
                                <option value="Fiji">Fiji</option>
                                <option value="Finland">Finland</option>
                                <option value="France">France</option>
                                <option value="French Guiana">French Guiana</option>
                                <option value="French Polynesia">French Polynesia</option>
                                <option value="French Southern Territories">French Southern Territories</option>
                                <option value="Gabon">Gabon</option>
                                <option value="Gambia">Gambia</option>
                                <option value="Georgia">Georgia</option>
                                <option value="Germany">Germany</option>
                                <option value="Ghana">Ghana</option>
                                <option value="Gibraltar">Gibraltar</option>
                                <option value="Greece">Greece</option>
                                <option value="Greenland">Greenland</option>
                                <option value="Grenada">Grenada</option>
                                <option value="Guadeloupe">Guadeloupe</option>
                                <option value="Guatemala">Guatemala</option>
                                <option value="Guinea">Guinea</option>
                                <option value="Guinea Bissau">Guinea Bissau</option>
                                <option value="Guyana">Guyana</option>
                                <option value="Haiti">Haiti</option>
                                <option value="Heard and MC Donald Islands">Heard and MC Donald Islands</option>
                                <option value="Honduras">Honduras</option>
                                <option value="Hong Kong">Hong Kong</option>
                                <option value="Hungary">Hungary</option>
                                <option value="Iceland">Iceland</option>
                                <option value="India">India</option>
                                <option value="Indonesia">Indonesia</option>
                                <option value="Iran">Iran</option>
                                <option value="Iraq">Iraq</option>
                                <option value="Ireland">Ireland</option>
                                <option value="Israel">Israel</option>
                                <option value="Italy">Italy</option>
                                <option value="Jamaica">Jamaica</option>
                                <option value="Japan">Japan</option>
                                <option value="Jordan">Jordan</option>
                                <option value="Kazakhstan">Kazakhstan</option>
                                <option value="Kenya">Kenya</option>
                                <option value="Kiribati">Kiribati</option>
                                <option value="Korea, Democratic People's Rep">Korea, Democratic People's Rep</option>
                                <option value="Korea, Republic of">Korea, Republic of</option>
                                <option value="Kosovo">Kosovo</option>
                                <option value="Kuwait">Kuwait</option>
                                <option value="Kyrgyzstan">Kyrgyzstan</option>
                                <option value="Laos">Laos</option>
                                <option value="Latvia">Latvia</option>
                                <option value="Lebanon">Lebanon</option>
                                <option value="Lesotho">Lesotho</option>
                                <option value="Liberia">Liberia</option>
                                <option value="Libya">Libya</option>
                                <option value="Liechtenstein">Liechtenstein</option>
                                <option value="Lithuania">Lithuania</option>
                                <option value="Luxembourg">Luxembourg</option>
                                <option value="Macau">Macau</option>
                                <option value="Macedonia">Macedonia</option>
                                <option value="Madagascar">Madagascar</option>
                                <option value="Malawi">Malawi</option>
                                <option value="Malaysia">Malaysia</option>
                                <option value="Maldives">Maldives</option>
                                <option value="Mali">Mali</option>
                                <option value="Malta">Malta</option>
                                <option value="Marshall Islands">Marshall Islands</option>
                                <option value="Martinique">Martinique</option>
                                <option value="Mauritania">Mauritania</option>
                                <option value="Mauritius">Mauritius</option>
                                <option value="Mayotte">Mayotte</option>
                                <option value="Mexico">Mexico</option>
                                <option value="Micronesia">Micronesia</option>
                                <option value="Moldava">Moldava</option>
                                <option value="Monaco">Monaco</option>
                                <option value="Mongolia">Mongolia</option>
                                <option value="Montenegro">Montenegro</option>
                                <option value="Montserrat">Montserrat</option>
                                <option value="Morocco">Morocco</option>
                                <option value="Mozambique">Mozambique</option>
                                <option value="Myanmar">Myanmar</option>
                                <option value="Namibia">Namibia</option>
                                <option value="Nauru">Nauru</option>
                                <option value="Nepal">Nepal</option>
                                <option value="Netherlands">Netherlands</option>
                                <option value="Netherlands Antilles">Netherlands Antilles</option>
                                <option value="New Caledonia">New Caledonia</option>
                                <option value="New Zealand">New Zealand</option>
                                <option value="Nicaragua">Nicaragua</option>
                                <option value="Niger">Niger</option>
                                <option value="Nigeria">Nigeria</option>
                                <option value="Niue">Niue</option>
                                <option value="Norfolk Island">Norfolk Island</option>
                                <option value="Northern Mariana Islands">Northern Mariana Islands</option>
                                <option value="Norway">Norway</option>
                                <option value="Oman">Oman</option>
                                <option value="Pakistan">Pakistan</option>
                                <option value="Palau">Palau</option>
                                <option value="Palestine">Palestine</option>
                                <option value="Panama">Panama</option>
                                <option value="Papua New Guinea">Papua New Guinea</option>
                                <option value="Paraguay">Paraguay</option>
                                <option value="Peru">Peru</option>
                                <option value="Philippines">Philippines</option>
                                <option value="Pitcairn">Pitcairn</option>
                                <option value="Poland">Poland</option>
                                <option value="Portugal">Portugal</option>
                                <option value="Qatar">Qatar</option>
                                <option value="Reunion">Reunion</option>
                                <option value="Romania">Romania</option>
                                <option value="Russian Federation">Russian Federation</option>
                                <option value="Rwanda">Rwanda</option>
                                <option value="S Georgia and S Sandwich Islands">S Georgia and S Sandwich Islands</option>
                                <option value="Samoa">Samoa</option>
                                <option value="San Marino">San Marino</option>
                                <option value="Sao Tome and Principe">Sao Tome and Principe</option>
                                <option value="Saudi Arabia">Saudi Arabia</option>
                                <option value="Senegal">Senegal</option>
                                <option value="Serbia">Serbia</option>
                                <option value="Seychelles">Seychelles</option>
                                <option value="Sierra Leone">Sierra Leone</option>
                                <option value="Singapore">Singapore</option>
                                <option value="Slovakia">Slovakia</option>
                                <option value="Slovenia">Slovenia</option>
                                <option value="Solomon Islands">Solomon Islands</option>
                                <option value="Somalia">Somalia</option>
                                <option value="South Africa">South Africa</option>
                                <option value="Spain">Spain</option>
                                <option value="Sri Lanka">Sri Lanka</option>
                                <option value="St Helena">St Helena</option>
                                <option value="St Kitts and Nevis">St Kitts and Nevis</option>
                                <option value="St Lucia">St Lucia</option>
                                <option value="St Pierre and Miquelon">St Pierre and Miquelon</option>
                                <option value="St Vincent and Grenadines">St Vincent and Grenadines</option>
                                <option value="Sudan">Sudan</option>
                                <option value="Suriname">Suriname</option>
                                <option value="Svalbard and Jan Mayen">Svalbard and Jan Mayen</option>
                                <option value="Swaziland">Swaziland</option>
                                <option value="Sweden">Sweden</option>
                                <option value="Switzerland">Switzerland</option>
                                <option value="Syria">Syria</option>
                                <option value="Taiwan">Taiwan</option>
                                <option value="Tajikistan">Tajikistan</option>
                                <option value="Tanzania">Tanzania</option>
                                <option value="Thailand">Thailand</option>
                                <option value="Timor-Leste">Timor-Leste</option>
                                <option value="Togo">Togo</option>
                                <option value="Tokelau">Tokelau</option>
                                <option value="Tonga">Tonga</option>
                                <option value="Trinidad and Tobago">Trinidad and Tobago</option>
                                <option value="Tunisia">Tunisia</option>
                                <option value="Turkey">Turkey</option>
                                <option value="Turkmenistan">Turkmenistan</option>
                                <option value="Turks and Caicos Islands">Turks and Caicos Islands</option>
                                <option value="Tuvalu">Tuvalu</option>
                                <option value="US Minor Islands">US Minor Islands</option>
                                <option value="Uganda">Uganda</option>
                                <option value="Ukraine">Ukraine</option>
                                <option value="United Arab Emirates">United Arab Emirates</option>
                                <option value="United Kingdom">United Kingdom</option>
                                <option value="Uruguay">Uruguay</option>
                                <option value="Uzbekistan">Uzbekistan</option>
                                <option value="Vanuatu">Vanuatu</option>
                                <option value="Vatican City">Vatican City</option>
                                <option value="Venezuela">Venezuela</option>
                                <option value="Vietnam">Vietnam</option>
                                <option value="Virgin Islands (British)">Virgin Islands (British)</option>
                                <option value="Wallis and Futuna">Wallis and Futuna</option>
                                <option value="Western Sahara">Western Sahara</option>
                                <option value="Yemen">Yemen</option>
                                <option value="Yugoslavia">Yugoslavia</option>
                                <option value="Zambia">Zambia</option>
                                <option value="Zimbabwe">Zimbabwe</option>
                            </select>

                    </div>
                    </div>
                    <div class="col-md-6">
                        <div class="form-group">
                            <label>Title of video</label>
                            <sup class="required" title="Required">*</sup>
                            <input type="text" name="title" title="Title of video" value="{{old('title')}}" class="file" name="video">
                        </div>
                    </div>
                    <div class="col-md-6">
                    <div class="form-group">
                        <label>Regional Agency</label>
                        <sup class="required" title="Required">*</sup>
                        <select class="file" title="Regional Agency" id="state" {{old('agency')}} name="agency">
                                <option value="">Select your regional agency</option>
                                <option>Africa</option>
                                <option>Asia</option>
                                <option>Australia</option>
                                <option>Europe/United Kingdom</option>
                                <option>North America</option>
                            </select>
                    </div>
                    </div>
                    <div class="col-md-12">
                    <div class="form-group">
                        <label>Category</label>
                        <sup class="required" title="Required">*</sup>
                        <select class="file" title="Category" id="state" {{old('category')}} name="category">
                                <option value="">Select a category</option>
                                <option value="Traditional Rhythm (Small Band)">Traditional Rhythm (small band)</option>
                                <option value="Traditional Rhythm (Large Band)">Traditional Rhythm (large band)</option>
                                <option value="Voices and Percussion (Small Band)">Voices and Percussion (small band)</option>
                                <option value="Voices and Percussion (Large Band)">Voices and Percussion (large band)</option>
                                <option value="Melodic Percussion (Small Band)">Melodic Percussion (small band)</option>
                                <option value="Melodic Percussion (Large Band)">Melodic Percussion (large band)</option>
                                <option value="Drum Kit Solo">Drum Kit Solo</option>
                                <option value="Drum Line Face Off (Small Band)">Drum Line Face-off (small band)</option>
                                <option value="Drum Line Face Off (Large Band)">Drum Line Face-off (large band)</option>
                                <option value="Innovative and Creative Rhythm (Small Band)">Innovative and Creative Rhythm (small band)</option>
                                <option value="Innovative and Creative Rhythm (Large Band)">Innovative and Creative Rhythm (large band)</option>
                              </select>
                    </div>
                    </div>
                    <div class="container" style="margin-top:10px;">
                    <label style="margin-bottom:-10%;">VIDEO UPLOAD</label><hr>
                    <input type="file" title="Upload a Video" name="video" class="file">
                    </div>
                    <div class="col-md-12 col-sm-12">
                    <br>
                        <button type="submit" class="btn btn-info btn-block"><i class="fa fa-save"></i>&nbsp; SUBMIT APPLICATION</button>
                    </div>
                    </div>
                    </form>

但是问题是,我不知道该怎么办。

任何帮助将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:1)

您不需要在服务器端执行任何特殊操作。如果您愿意使用Ajax提交表单,则可以使用纯客户端代码来完成此操作。您需要做很多小事情,但这是您的主要步骤:

  1. 不要提交传统的表单。
  2. 相反,创建一个FormData对象。 FormData是在JavaScript应用程序中提交表单的新方法。
  3. 当用户单击“提交”按钮时,构造此FormData对象。
  4. 对于文件输入,您应该使用<input type="file" />
  5. 创建XHR对象的实例。 XHR为XMLHttpRequest
  6. XHR的优点在于,您将收到一个进度事件,该事件指示已发送了多少字节。 这正是您在这里所需要的
  7. 使用XHR对象触发的onprogress事件来获取定期进度数据。
  8. 还请记住使用multipart表单类型。
  9. MDN有一篇非常不错的文章,描述了整个流程。 https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects

注意:您可能听说过浏览器中新的fetch API。您可以使用它,但是很遗憾,它基于Promise,并且不会返回实际的进度事件。所以你不能使用它。

答案 1 :(得分:0)

下面是一个Vue代码段,使用axios来执行Harshal的解决方案以发出HTTP请求

data () {
  return {
    uploadProgress: 0
  };
},

computed: {
  config () {
    return {
      headers: { 'Content-Type': 'multipart/form-data' },
      onUploadProgress: progressEvent => {
        this.uploadProgress = Math.floor((progressEvent.loaded * 100) / progressEvent.total);
      }
    };
  },
},

methods: {
  upload (e) {
    const files = e.target.files || e.dataTransfer.files;
    if (!files.length) {
      return;
    }

    const data = new FormData();
    data.append('fileNameGoesHere', files.item(0));

    axios.post(this.uploadUri, data, this.config).then(response => {
      // file uploaded successfully
    });
  },
}
相关问题